Speaking from the point of view of having a little bit of experience with the eZ80, this is indeed the greatest obstacle; there are ways of forcing addressing external-to-the-chip I/O ports, but if you want to output a 0 to an external-to-the-chip port you can't use the straight OUT instruction. The total lack of DRAM refresh also makes it less than ideal for a Z80 replacement.
HD64180/Z80180/Z8S180 can have their internal device addresses set to one of a few starting addresses, but otherwise you have to do special magic to address off chip I/O in that range (special magic = make sure A<>0 for IN/OUT instructions using A, and B<>0 for I/O instructions using C register indirect).
And even though I have a soft spot in my heart for the grand old Z800/Z280, the fact is, other than the lack of RAS-only row-address-counter DRAM refresh of the Z80 and '180, the ultimate Z80 with the most compatibility is the current production (
https://www.digikey.com/en/products/detail/zilog/Z8038018FSG/928902 ) 16/32 bit Z380 MPU @ 18MHz, like these:
View attachment 1037672
Yeah, Z380 can address 4GB of RAM, although at 18MHz you probably wouldn't want to. Highly efficient, almost as efficient as eZ80, but tops out at 18MHz to eZ80's 50MHz. But, Z380 is currently stocked and is an active item in Zilog's catalog. It's a CPU only, so no on-chip peripherals to speak of. I wish I had time to put together a Z380 system with my hand-soldered sample you see in the photo; Real Life (TM) prevents much of that for me right now. Maybe one day; I have four chips, two not soldered to carriers, and some schematics drawn. Likewise the eZ80; I have the beginnings of an eZ80 with VGA output and PS/2 input built on the Zilog modules, a hand-wired interposer, and an Altera DE1 FPGA board. Maybe one day I'll get enough time to finish it.