My BSc degree taught lots of things that would be useful for an average software developer with some experience. MSc programs tend to be more research-oriented and thus less practical unless you work in some R&D niche that matches what you studied 1-to-1.
Practical BSc materials included other programming paradigms, mostly pretty advanced declarative and functional programming, equivalent to big chunks from CTM and a typical Haskell book. Also deep relational algebra and calculi, including query optimization, and low-level driver programming, concurrency models, and networking. Further to that, compiler construction, amounting to significant chunks of the Dragon Book, etc.
This is something you can self-study. But, obviously, an institution will provide good structure and credentials. Depending on the cost, it might make more or less sense. The OP might want to look at good EU universities where tuition is free for EU nationals and coursework is taught in English at BSc level.
> significant chunks of the Dragon Book
You did this as an undergrad? I am surprised. That is normally graduate level. I suppose it isn't entirely paradoxical, but I disliked the dragon book, even though I rather liked Hopcroft/Motwani/Ullman's (theoretical, non-compiler book) Automata Theory, Languages, and Computation. (Turing award winner) Ullman giveth and taketh away.
Purple dragon (Aho/Lam/Sethi/Ullman) is probably better than red (or green) dragon though, as it adds some interesting topics.
In an undergrad course, I'd probably prefer a simple book that uses recursive descent.
Yes, my undergrad school was dominated by some compiler researchers. We didn't cover it all, by any means, but we built lots of lexers, parsers, and interpreters. There was an elective that went through the rest of the book. Crafting Interpreters would have been a better textbook, but it wasn't available at the time.