Turns out that this behavior was being caused by a plug-in with a default setting to convert all posts into excerpts, thereby stripping the markup.
I determined this by standing up a stock WordPress instance with none of my customizations or theme, replicating the installed plug-ins (just their existence, not their settings), and checking the feed after activating each of them.
The moral of the story is that you’ll miss a lot of behaviors and waste a lot of time tinkering with code and not focusing on replicating the behavior.