Is creating a joining/bridging table the most practical and efficient way of normalizing numerous M:M relationships in a database?
The real best differs case to case. May be after checking all of your 50 / 60 tables this could be arrived at. Though there is clear difference between 3NF and 6NF for sure, do not limit yourself on this.

For what you had explained, if and only if you wanted to have 6NF satisfied, the third table is essential. And you can have very simplest queries starting at class or starting at user.

But, going that way, for 50 / 60 tables, you will land up with too many cross reference tables which may be worth of having or not (depending upon your other tables by design). Remember that you are making all your queries bigger too. Also, being in 6NF sometimes affects scalability.

It is well normalized even if you just have CID within users table. I do not say - stick to just two tables and not three. 

There are cases when you had worked with 50 / 60 tables with all cross reference tables in place for a while, you yourself need to denormalize to improve the performance. Though normalization is essential while designing the databases, it will not always lead to best performance.

Refer
https://en.wikipedia.org/wiki/Denormalization