A professor of mine actually expressed the same concern, that if it was up to him that a compiler design course would be a mandatory part of the CS curriculum. However, whatever governoring body covers CS degrees focuses more of designing them as software engineering degrees and there just isn't time to add in a compiler design course.
Honestly, I don't know how it would be at more prestigious schools, but at my own there is very little interest among the student body, even among those interested in hardware, to want to take a compiler design course. I'm one of the few who would want to, but also generally have a better understanding of both hardware and software than most other students. Most students just want to be web developers, however, so I'd say they can pass on the whole compiler understanding.
That said, I can't say my programming experience in college has been vast. Most of my courses have been more theory based, with at most token projects to demonstrate the techniques. I've only had two difficult programming experiences in college (both from the professor who wants compiler design to be a required course and far beyond the coursework offered by any other professor I've had), and otherwise did more interesting and difficult projects in high school primarily for fun. Sad thing is, my programming experience isn't even all that deep, I'd say any student whose primary programming experience comes from the CS curriculum is going to be woefully underprepared for the real world. Then again, I may be biased from coming in with enough CS knowledge to breeze through or skip the first two years of classes, perhaps if I had to work through the difficulties at a university level instead of a high school level I'd have more appreciation for the programming instruction I've received.
Basic code optimization strategies and modular, easy to work with code are all most people need though. Needing to know how to optimize assembly these days is about as useful as compiling everything from source for a specific processor like some linux-junkies do. I can agree that it can be helpful for debugging, however.
I think having an assembly course is a good idea, just so you understanding of the program counter, the stack, registers, memory and how a processor performs instructions. The vast majority of people will probably never program in assembly again, but it's good to have an idea of how things work.
We've had a lot of courses that skirt around those ideas. Computer Organization and Programming Languages both did, and the digital logic lab is giving some insight onto how instructions propagate through a circuit.
Comp Org was a fun course, the small MIPS assembly programming we did was interesting. It seemed very possible to write object oriented code in it, but it was also fun exploiting boolean logic to do arithmetic and other stuff as opposed to using the built in operators. We had one task we were given that was only vaguely described in binary, but I believe it was actually an example of SIMD multiplication. (teacher didn't discuss it, but I got full credit for my explanation of what the code was doing)
I kind of appreciate the relative ease of the CS curriculum though. I'm also a physics major credit overloading every semester, and physics is...quite difficult. All the physics teachers I've had have fallen into one of two categories:
Explicitly teach you the basics, then give you incredibly difficult mathematical problems to solve that truly test your knowledge of differential equations, trig substitutions, and general knowledge of math...
Or...
Give a brief overview of the basics, then give incredibly open ended (but rather simple problems) that make you think about the reprecussions of the basic laws taught. This is fun, but in some ways even more difficult than the mathematically complex stuff due to the round about ways you may have to go to accomplish the answers.