Honestly, I say we ditch NSFW as a on/off switch and go with a mandatory tagging system. We can clarify NSFW into content warning tags, e.g. CW - Gore, CW - Death, CW - Breast, CW - Genitalia.
Users could then set their own preferences on which tags would cause a post to be masked or simply hidden.
But why stop there? Tags could be very useful in our federated environment to help communities mesh better with each other.
Communities could be able to specify a list of mandatory tags, i.e. the Swallow community could require posts specify African Swallow or European Swallow (or both or neither). Communities could also make some tags implied, so the AfricanSwallow community might just imply that posts are Africian Swallow unless user changes it.
Underneath the hood, all tags are just treated as part of the post text, so the backend performance impact will be minimal. However moderation tools would be able to consider tags when deciding how to handle a post.
Of course, the server/instance owner can then simply make a policy of what kinds of content warnings they require, and communities can then build other tags on that to meet their community needs.
How would you tag your Dickcissel and your Great Tit going after an Antarctic Shag and an Invisible Rail? Do we want our Flying Steamer Duck having fun with a Fluffy-backed Tit-Babbler?