DJGPP is actually pretty good. It does only work on 386+ models, because it needs a proper protected mode interface. But that also means you’re not limited by the 16bit nature of older CPUs. You’ll also get support for modern C++ (and C11).
If you want to go for 16bit code, be prepared for some extra weirdness in C (you’ll have to worry about “memory models” and segments, and all that). It can be very rewarding, but may be quite the culture shock for people who are used to writing 32 or 64 bit code for modern systems.
If you want to have a go at that, OpenWatcom is actually not bad, but it is less well maintained than DJGPP and has does show its age here and there, with only older standards being supported, the command line being somewhat crappy and some bugs that can make you question your sanity before you find out the compiler is to blame 😉
So for 16bit code, I’ve only really used assembly extensively, because of the aforementioned issues with OpenWatcom. But for simple stuff it’s probably good enough.