Where did I code my multiplier wrong?
There is nothing wrong in it. You are multiplying two unsigned numbers in your Verilog code. So you will get an unsigned result. The valuesx, y and z are by default unsigned unless you explicitly specify it as signed.
For example, this is what actually happened in the first stimulus:
$$181_{10} \times 223_{10} = 40363_{10}$$
These values are interpreted as unsigned by the simulator for multiplication. The result is correct as well.
But for display purpose, you probably set your simulator to represent the waveforms in signed radix instead of unsigned radix.
So, MSB is now considered as sign bit, and if MSB = '1', the number is considered to be negative and the magnitude is in two's complement form. And hence the simulator displayed:
181 as 181-256 = -73,
223 as 223-256 = -33, and
40363 as 40363 -65536 = -25173