C is a very simple language. Critics even call it a collection of assembler macros. If you look at the assembler output of a C compiler you'll see that this is almost true. And C does not have a runtime environment. That makes C programs as small as assembler programs (if you avoid static link libraries).
Of course you can write blown-up programs in C, but you can do this in assembler, too. It's just more work. And you can write very efficient programs in C, almost as efficient as you can in assembler. As you said, the C compiler creates better assembler than you do. So why do you think that C programs have to be bigger than assembler programs ?