Yes, Promises are definitely the solution for callback hell and legacy code (see promisify). But keep in mind that async/await don't add something new. They extend the Promise functionality. A async function returns nothing else than a Promis and the await keyword is waiting for the resolve of a Promise.
It makes sense to only use plain Promises if you working in non ES2017 environments (older Browsers) so you can skip the transpilation step.
When I use async/await, I mostly combine it with plain Promise techniques (for example `Promise.all()` for parallel execution). So I get the best of both worlds. A lot of people surely would say it is a bad code style, but in my opinion it is simply effective.