No, it's very common. It's widely used in garbage collectors (instead of write barriers) and JIT compilers (for changing the code and also just for halting code execution) among other places. It's so common that userfaultfd was added as a better approach:
http://man7.org/linux/man-pages/man2/userfaultfd.2.html…
The reason is that when doing a copying (moving) collection cycle to compact the heap, they need to intercept and handle writes from other threads to the portion of the heap they're currently in the process of moving. I don't know all the details of this in a modern GC though.
The alternative to using memory protection is having write barrier checks slowing down code even when a GC isn't in process. Reads are fine because they aren't going to make the new compacted heap inconsistent with the old one. Only writes need to be intercepted/handled somehow.
We have known this was the root of the issue for an embarrassingly long time and still have no hardware primitives for fast conditional memory traps at a fine grain (MMU storms don't count). And Intel is over here developing Minix webservers on ME.