Thanks for the ideas. I think djangocms-page-tags or a page extension is the right approach, but for now, I've got:
<body data-cms-path="{{ request.current_page.get_path }}">
which renders the attribute value as "section-1/subsection-1/page-1". So, in my CSS, I can use:
[data-cms-path*="subsection-1"] {
to style section elements. Of course, this will break of the slugs change, or if they're different in Spanish, or if a section page exists outside of the tree. But it works for now.