I was rather shocked by the amount of gaps I uncovered in my understanding. Sure there were some boring classes, but developing an understanding of the whole system from the logic gate up was hugely beneficial. Being forced to work through the details of operating systems, compilers, automata, and algorithms, as well as the history, theory, and formal structures of all the major families of programming languages, gave me very nice framework to build on over the years. Even studying the academic side of software engineering was more useful than I thought it would be.
I also learned a lot more than I would have had I done my degree when I was 18. If it were more practical, I'd recommend everyone take a few years working as an apprentice programmer before immersing yourself in the theory.
There's nothing magical about a degree. You can learn everything I did by reading, watching youtube videos, and practicing. But I never would have, and I clearly didn't in nearly 10 years of working at it. Having access to professors, TAs, and a peer group studying the exact same thing you are is a huge force multiplier. The tight feedback loop kept my understanding from straying off course and let me build accurate mental models much quicker than I could on my own.
I've known many engineers who were smarter and probably better programmers than me who didn't have CS degrees. The best engineer at my current company doesn't have a CS degree, but I'm almost completely certain that if he had a stronger theoretical background, that he'd be even better.