The prolific Norwegian was kept quiet by his old teammates for much of a cagey Champions League encounter at the Etihad Stadium on Tuesday but clinically volleyed in six minutes from time.
England international Jude Bellingham had given Dortmund a surprise lead after the break but City levelled with a stunning strike from John Stones 10 minutes from time.
Haaland, who scored a remarkable 86 goals in 89 appearances for Dortmund before leaving in the summer, then struck his 13th in nine for his new club having earlier hit the post.
The victory gave City the outright lead in Group G ahead of back-to-back games against Copenhagen.
No music was played in the build-up to the game as a mark of respect following the death of the Queen and a period of silence was well observed prior to kick-off.
When the action got under way, it was City who initially dominated possession but they struggled to create meaningful opportunities against well-organised opposition.
Former Liverpool midfielder Emre Can shielded the visitors’ back line and Haaland saw little of the ball.
City’s first effort on goal did not come until the 25th minute when Joao Cancelo blazed well over.
Dortmund occasionally broke out and Salih Ozcan found space on the edge of the area but Ederson comfortably dealt with his strike.
Jack Grealish was repeatedly frustrated as he attempted to cut in from the left and Kevin De Bruyne was also kept quiet, aside from one moment when he almost sent Haaland clear. Mats Hummels, however, read his intentions.
Dortmund attempted to inject some life into proceedings after the break and went close as Marco Reus shot wide from a tight angle.
They maintained the pressure and were rewarded after 56 minutes by Bellingham, who timed a run to the near post perfectly to head home from a Reus cross.
City manager Pep Guardiola responded by sending on Julian Alvarez, Bernardo Silva and Phil Foden in a triple substitution and City began to show some urgency.
Foden immediately teed up Haaland but the Norwegian shot against the outside of the post. When Foden looked for Haaland again, Hummels superbly cut out his cross.
The tide had turned although the equaliser, when it arrived, came from an unlikely source.
Stones, who had been given more licence to push forward than usual in his role as right-back, decided to chance his luck from distance and the ball swerved into the top corner.
Goalkeeper Alexander Meyer might have done better but it was still a fine effort from the defender.
The momentum was now with City and Haaland had the final word when he leapt high to reach a superb Cancelo cross and volley home.
There was a bit of pushing and shoving in the closing moments and Guardiola was shown a yellow card for something he said after the final whistle.