My expectations may be colored by having a pretty good default implementation of a shared mutex in our codebase :) (folly::SharedMutex)
I've had to resort to seqlocks + async reclamation (either RCU or hazard pointers, depending on the case) only in a handful of very very specific cases.
Also, yes my critical sections are often closer to the pointer swap case that might color my expectations.