I've mentioned my approach at length in other threads.
My solution was to allow only the warlock as a casting class. So no wizard, cleric, druid, bard, sorcerer, arcane trickster, eldritch knight, etc. If you want to cast spells, take a feat for it or be a warlock.
Since I run a low-magic campaign (obviously), this choice had meant I had to make other alterations as well. As mentioned above, "low magic" has much more to do with the society's perception of magic and magic users than class choices. So in my campaign all magic users are referred to as "sorcerers," and are highly distrusted. I thought of going deeper and distinguishing between "white magic" and "black magic," and for many of the people there probably IS a distinction, but it hasn't become relevant in my campaign yet. The PCs are about to undertake an ocean voyage, though, so the superstitious sailors are probably a good place to explore those nuances.
A low-magic campaign also means that published adventures - even those purporting to be "low-magic" need to be tweaked. I either replace enemy spellcasters with non-casters or make them "demon" summoners. Demon in quotes because in my campaign, ANY summoned creature is considered a demon. It's only when you start looking for low-magic options that you notice just how much freaking magic is sprinkled through D&D though.
NOTE: I don't use experience points, so I don't give a flying hoot about the relative "challenge" of a caster vs. non-caster in the swaps I make. YMMV.