remove "magic" required for things like WriteLn()
Minimalism in general. Maybe also portability.
Strings implemented as zero-based arrays of char might or might not have been an advance,
Well, he would have been comparing from seventies Pascal, not eighties UCSD/TP strings.
On one hand the open array ability improved writing general string routines compared to seventies pascal, on the other hand in retrospect keeping it mostly statically allocated was maybe a missed opportunity, and something that wouldn't survive the eighties. Even for systems programming.
bitsets were an advance but ordering was platform-specific without adequate infrastructure.
Maybe for embedded programming, flag testing etc. But imho bitpacking of records is more important for that.
3) Fixes dangling-else. Arguably provides a more robust base language on which extensions could be built, but ideally this would require an extensible language definition accessible to (senior) application programmers.
Some of the language things of Modula2 were ok, compared with nineties Pascal. But it didn't even have the practical extension and implementation that Pascal had. The Modula2 world was so small.
I do know that some medical vendors used Modula2 a lot in the nineties for critical systems, but most of that has disappeared (some reached out to me in the 2005-2010 timeframe to assess what they had, which was TS 1.17 dos code, so not much)
Oberon was always more experimental. I never saw professional Oberon use myself.