The key to taking better pictures is to take twice as many as you would otherwise take, and throw at least half of them away during review. Over time, you'll take more, and better photos.
The key to writing better code is to write more of it, then refactor it once you've discovered what actually works to solve the problem. Spend time making sure you document it, and don't ever take pride in "clever" code. Pride go'eth before the fall.
Always be willing to throw code away, and be willing to rewrite it, at least once.
To get the hacking feeling away: the only way is to learn more of the details of how certain things work on lower levels. That will give you more control and a better feeling that your solution is solid and better vs other solutions.
For creating design, it helps to be mentored actually. Reading books about design patters and architecture helped me but nothing worked as much as a good mentor.
You can always start with 'how would I desing a software that does X?' and think 'how would it change if I add Y' or 'how much can this scale?'. Find people around you or on the internet to discuss your ideas, that helps a lot,
I think the skill you need is time management. or rather yet, laziness. as Bill Gates once said, he will always get a lazy person because he will find an easy way to do it.
think about it as a business (whether it is or not) every action has a price, in cash or in time or in both. aim for low hanging fruits. adapt to changes when they happen. experiment in small scale.
no person in the world can come up with design in their head and that would be it. software is never ending cycle of improving, layering, adapting. more often than not, stillness means death. design evolves with the code, what makes good design is how easy it is to evolve, and that takes skills and experience. sounds like you have the skills ("hack together until they work") and 3 years experience is no joke. to sum it up, my advice to you is to look at case studies of success and failure, these lessons often reflect on more than just programming
What really helped me, was learning Scala and get more into functional programming, especially immutability. Now I write better code with better architectures in other languages, e.g. Typescript, Java, Dart, Python.
The change of thinking that is needed to deal with immutability transformed the way how I approach software design.
The designs that I'm proudest of and that took the most thinking all had an element of figuring out how to decompose a system into layers and resolve any "chicken and egg" problems that prevented a clean decomposition.