But my counter point would be that many operating systems have been built in C, and people who rely too much on "modern compilers" often don't know what's really happening. I cut my teeth doing OS-level programming in C at the interrupt-handler level. Good times.
I'm not saying people should start all new projects in C, but a good solid grounding in C really does give one a good perspective on what's really happening in the innards of your code. It's about as close to "bare metal" programming as you can get without assembly.
I've met a few coders who had only ever worked at very high level stuff, and a lot of what they did more or less relied heavily on libraries they didn't really understand, or have any sense of the performance impacts when used inefficiently.
That being said, hand rolling your own memory management isn't something I really miss.
But every now and then I still like to sing a few bars of:
Pointers to pointers to printf()-like functions;
Unary minus and nested conjunctions;
Integers, booleans, characters, strings;
These are a few of my favourite things.
Because, "Pointers to pointers to printf()-like functions" was a pretty nifty language feature sometimes.
You could do some pretty neat things in C.