Are you objecting to the use of the C function printf() within a embedded environment for debugging or are you objecting to the use of serial port output as a debugging tool ?
In AVR land, I don't use printf as it's bloated (by embedded standards), but I do have my own interrupt based UART I/O routines that I use for normal communication with other serial devices as well as debugging.
The routines implement a tty for the hardware UART as well as a Tx-only software UART for debugging output. As both UART's are interrupt based, and the output can be optionally buffered in an application specified buffer, I see very little overhead in using the software UART for outputting debug information.
Simon.