Yup. The printf() family is required to do all sorts of magical formatting, and that takes code.
Some microcontroller implementations have "reduced capability" printf()- style functions for just the reason you've seen. For example, the Imagecraft AVR C compiler (ICCAVR) has three "sizes" of library code for the printf() family (portions snipped from the help file):
basic: only %c, %d, %x, %X, %u, and %s format specifiers without modifiers.
long: %ld, %lu, %lx, %lX are supported, in addition to the width and precision fields. floating point: adds the %f specifier.
Each one needs more space for the library code.
If at all possible, avoid the printf() family altogether on smaller microcontrollers. It's possible (and frequently necessary) to do your own string formatting.