Some z80 systems have more than 64K, addressed by switching 16K pages in and out of the 0..65535 address space. ZX Spectrum machines are 16K, 48K and 128K, with the 48K model typically the 'standard' model to target.
Part of that 48K is shared video memory (6912 bytes for the display), plus some system variables.
The FPC Z80 target is impressive (I especially appreciate detail such as auto-generating a .tzx file for Spectrum emulators to load).
I'm compiling without debug information, and with smart-linking enabled, and O1 optimisation. As you say, chances are I've got something not quite right, though 32K for a complete system.pp is not unexpected. An option or $define for (almost) no system.pp could work wonders here!