Configuring only the code you need can bring the actual kernel size down to very small images. Configuring a kernel for a small embedded application takes time, but its well worth it. And fast.
It's nice to have choices. It's also nice to have most of those choices sitting on your hard drive unused, rather than being loaded into memory. It looks like that's still what's happening with Linux.
Now that squashfs is finally in vanilla, hopefully a solid unionfs implementation will make it in soon. Both have been shipping on livecds for years, but just never made it all the way upstream.