If you can figure out a way to create html that is easily restyled into a mobile menu using CSS alone that is the cleanest way. Typically all mobile menus need some sort of toggle / button to deploy so you are going to at least add JavaScript or jQuery into the mix.
The hiding and showing of content (also via media queries) isn't really a hack but is a much faster way of working when prototyping.
For example, I often use the Foundation Top-bar when prototyping, then create a custom menu with basic Foundation components and then create the mobile menu using responsive-nav as it does not have the jQuery dependency and is much more light weight. In contrast, a lot of sites use the top-bar and offcanvas elements, both of which are very heavy in CSS and JS when compared to just using the grid, buttons, dropdown, etc.
As Ryan says there is a tradeoff. You have to decide how important clean semantic markup is to you and your project and decide if it is worth the extra time and effort up front, for largely the same experience for the end user.