Callbacks on their own don't give you a control flow, and create what you just referred as "Callback hell".
What promises offer is a control flow of success / error callbacks. They are able to pass values from callbacks to callbacks, and that is where the main difference is between a callback and a stream or promise callback: they return a value. So it is not about calling back, it is about returning something back. You then don't have an inversion of control callbacks usually give you ("callback hell" is not just an indentation issue).