A key trade-off is IPC per thread vs area. The CPU needs a high IPC per thread but by achieving this, the area goes
disproportionately up and IPC / mm^2 goes down.
The GPU does not need high single-thread performance so it has lots of simpler and smaller cores, and as a result the total IPC goes way up.
And then of course the GPU has dedicated hardware for operations like rasterization and texture interpolation which the CPU lacks. On the other hand, the CPU needs to run an OS so each core has support for virtual memory, interrupts and other types of instructions that are either not needed on the GPU or at least do not need to be supported by each one of the little cores and are handled in a more global manner, making these cores even smaller.