Different schools of thought. Some people don't like it when compiler does things behind your back and distances the running code too much from the written code. Wholesale function replacement seems like nasty thing to have done.
The sad matter of fact is that printf API is not very well designed, in that every time printf is executed, the format string is scanned again, looking for the % characters. A more carefully designed API would require you to preprocess the format string using something like printf_t format = printf_prepare("foo %d bar"), and then you could use the format repeatedly without any parsing overhead.
In this way, it would be possible to have a dumber compiler and likely more efficiency than with current printf.