This is a pattern I’ve struggled with, too. I tend to favor the visibly hidden accessible label as it’s the least pieces to fail. ARIA markup is pretty well supported, but CSS removes it ad a dependency, and degrades gracefully.
If CSS isn’t honored, the worst you have is a layout with an extra label showing. If ARIA fails…