Its a harsh truth but one needed in order for one to grow. But first lets clarify a few things:
I don't mean by "A bad craftsman blames his tools" that with "any" tool you can achieve excellency. I mean that once you are skilled enough you'll select the tools that you need to deliver excellency. I mean Da Vinci would probably make better painting than you using a pitchfork and some bucket of paint. But it wouldn't be an exceptional painting because it was made with a tool intended for an other purpose.
What matters is you general skill. If you blame your tools for your failures then the problem probably is within you. What I'm trying to say is that you have to learn the skills that ensures you deliver bug-free, modular
and efficient software. Then you can see what tools help you the most in reaching that goal.
For the bug free part there are strategies like Test Driven Development (TDD), code reviews etc. Protecting yourself against bugs and regressions is documented and is a solvable problem.
For the modular part there are design patterns and architectures that can protect you against changes in the software requirements, technology changes, etc. Also documented (https://www.oodesign.com/, https://en.wikipedia.org/wiki/Hexagonal_architecture_(software), etc)
For the efficient part there is less obvious ways to do it properly in my sense. It's a creative endeavour in the end very much tied to the problem you are solving. For real time simulations you want some models that leverage parallelism and take advantage of CPU caches. For heavy IO you probably want to adopt the event loop model for its non blocking properties. For simple problems like a "isPalindrom" function you will use indexes to inspect the string rather than comparing it to its reversed self. Etc. You can be efficient at all levels and the rule of thumbs is, again, use the right tool for the right job. And also don't optimise right away you can sink a lot of time into optimisations and then having to throw them away because the requirements changed.
So working in those tree axis can improve drastically your code quality and soon you'll realise that what you learned can be applied to a multitude of languages, frameworks, etc. And you'll be like Da Vinci with the incredible ability to create software using a pitchfork.
Now go and be awesome!