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…
it seems like a crap design though. we don't want to handle every SIGSEGV, but rather only those that come from regions we've mmaped for very specific purposes.
Firefox also has a custom linker using this. On Android, the traditional officially supported approach to native libraries has them stored compressed in the apk and automatically extracted by the package manager to a library directory not writable by the application.
The more modern officially supported approach leaves them uncompressed in the apk (which only impacts installed size, since apk downloads should be compressed due to this approach for various kinds of resources, etc.) and aligned to page size. The linker knows how to map those.
The other common use case is optimizing code size for NullPointerExceptions in managed languages: instead of littering every object access with a check and branch, just blindly dereference and fix things up in the signal handler.