I'm not sure why you are using piecewice to hold the answers, but you could just use sort and get the last element:
answers =
List @@@ Last @@@
N@Solve[{z == 40 x + 50 y, 6 x + 10 y <= 672,
0.25 x + 0.15 y <= 24, 1.5 y <= 42, 0 <= x, 0 <= y}, {z},
Integers]
Sort[answers][[-1]]
(*=> *) {4230., x == 87. && y == 15.}
As for plotting the solution points, you could turn the conditional expressions into individual points and plot those using ListPlot3D:
zxy = answers //. {{a_, Or[b_, c_]} :> Sequence[{a, b}, {a, c}] ,
And -> Sequence, Equal[_, b_] :> b};
ListPlot3D[zxy[[1 ;;, {2, 3, 1}]], AxesLabel -> {"x", "y", "z"} ]
This doesn't work for arbitrary answer lists, but works in your case. If you have results with different logic constructs you can modify the replacement rules accordingly.
