This is an oft-covered topic, with many solutions.
Usually, one can at least brute-force their way out of this by using multiple texture samples, rotated, scaled, etc independently and then blended back to a final, aggregate map. More or less expensive in how you do it, look at the Texture Bombing node for an example.
Generally, you are better-served (efficiency-wise) with UV manipulation. This can help cut down on the overhead of multiple (or at least more) texture-samples but it’s also more complex-math (it’s like a trebuchet!). Good examples of what can be done are here: Unreal 4 UV Tricks — tharle VFX
He’s also got a video: https://www.youtube.com/watch?v=yj7-h_X_eu4
Rodrigo Villani is another good source: https://www.youtube.com/watch?v=MaDhhyrFbrM
There is also more advanced stuff like using temporal-sampling: Randomized tiling function, eliminate repeating patterns in your textures!