I'll admit, I've never seen compiler that made "nice" 8-bit code. Of course most 8-bit CPUs don't have requirements like cache management and instruction scheduling, either.
Actually, the Gameboy Color has a 'z80-like' instruction set (i.e., like a z80, but crippled) and a slow CPU, at that. I have always found C is an excellent tool for prototyping ASM work, being barely a step above it. Sure enough, someone had made a C compiler for it. It made some scary, awful looking output, but it ran.
You can get the big, seldom called things built in C rapidly, and even get the often called, critical things at least prototyped in it. The ASM version of the output is usually very available. Then it's just a matter of going into the spots where it mattered and cleaning up the mess.
Of course, other silly things like building DMA lists to look like call a stack, so you could set SP and "return" to "call" a sequence of things by getting the 'return from subroutine' behavior to invoke each next thing it needed to do had to be written, as did all the palette swapping during horizontal blank where we had very few cycles to do a lot of work before the CPU would be locked out of video memory again.
That's among the USUAL sort of work I used to do. In the 8-bit days, I actually knew the opcodes better than the equivalent assembler syntax for the 6502 in Apple, Commodore, Atari and my Ohio Scientific computer. Later with the Atari ST, I realised that the C compiler was doing a much better job for the amount of effort I put into things. Without the hard-core C, a lot of the later work I did on PC (DOS, Win16, Win32, Unix/Linux), N64, Playstation, Gameboy, Palm, etc. (Just call me "Jack") would've been a lot more time consuming. Especially when it came to re-using snippets. I've had to make games work in a lot of these. Palm OS was definitely the worst for getting graphics on the screen.