Personally I'm happy that PROGMEM causes compilation errors, as this reminds me that I don't yet know how to achieve the same functionality on the Due!
You don't need it on the ARM, because the ARM has an integrated memory address space, where the program and the data are both visible with standard memory instructions (though the code should be write protected).
The AVR is a so-called Harvard architecture, where the text and the data are in different address spaces that overlap, and you need different instructions to reference memory in the text/program section compared to the data section. So what PROGMEM does is move big constants to the text/program area, and then you use special functions to move it back to the data section so it can be used for things like calls with long strings.
In the GCC that is distributed with the Arduino IDE, it is old enough that the PROGMEM stuff is not as well integrated. When I was working on another embedded port for GCC (the SPU or cell), I added support in GCC 4.5 for having more integrated separate memory address spaces for that processor and the AVR gcc maintainer has used it to support PROGMEM in newer versions of the compiler. I have since moved onto the PowerPC backend which doesn't need the support, but it would be nice to know people use stuff I developed a few years ago and find it useful.