The German champions looked set to edge a contest dominated by both goalkeepers after Marco Reus pounced on a Jack Rodwell mistake to score just after the hour.
City keeper Joe Hart and his opposite number Roman Weidenfeller had both produced a string of outstanding saves to keep their respective sides in the game at the Etihad Stadium.
Balotelli’s late effort, after a contentious handball decision, ensured City now at least have a point from their opening two games in Group D.
The score could easily have been 3-3 at half-time, but was not due to the brilliance of the keepers.
Weidenfeller, in front of magnificent away support, was the first in action, as early as the first minute, as City, keen to get their campaign started after losing at Real Madrid, burst forward.
Samir Nasri hit the target with a snap-shot from the edge of the area, but Weidenfeller parried.
Dortmund were equally as keen to attack and also went close early on when Robert Lewandowski headed over from a Lukasz Piszczek cross.
City had another great chance when David Silva found Sergio Aguero, but Weidenfeller rushed out to smother the Argentinian’s shot.
Hart produced the first of a series of fine saves to tip a Mario Gotze shot from the edge of the area on to the post after a quick Dortmund counter-attack.
The breathless opening continued as Marcel Schmelzer and Jakub Blaszczykowski cut through City with some fine interplay, but the hosts managed to recover and clear their lines.
City captain Vincent Kompany was booked for halting another Dortmund counter with a sly tug on Reus’ shoulder.
Kompany got his judgement right soon after, however, when he denied Blaszczykowski with a well-timed challenge.
City suffered a blow when Javi Garcia was forced off with a leg injury just after the half-hour and was replaced by Rodwell.
That did not interrupt City’s attacking flow and Silva released Aguero moments later, but Weidenfeller did brilliantly to palm his long-range shot over.
Dortmund then enjoyed a good spell with Neven Subotic firing narrowly wide and Zabaleta sliding in to block a Schmelzer shot.
Hart came to City’s rescue twice in quick succession to deny Gotze, first blocking at close range and then tipping a thunderous drive on to the bar.
City went close again when Zabaleta floated in a dangerous cross, but after it dropped just over Dzeko’s head, Silva could only volley over.
Dortmund had the last chance of the first half when Ilkay Gundogan found space in the area, but Hart, yet again, was equal to the shot.
The second period began at a slower pace, but it was not long before the tempo picked up again.
Edin Dzeko did well to control a Yaya Toure pass with his chest and turn and shoot, but his effort lacked the power to trouble Weidenfeller.
City’s poor luck with injuries in the competition continued as, after losing two players in Madrid, Nasri was forced off and Aleksandar Kolarov took his place.
Hart was stretched again at the other end as he turned away a swerving shot from Gotze.
But the England number one could do little after Rodwell gifted the ball to Reus with a poor pass just after the hour and the Dortmund attacker burst forward to blast into the net.
Reus almost doubled the lead moments later after combining with Lewandowski, but could not beat Hart again as the keeper blocked with his feet.
The story then became even more about Hart as he again did brilliantly to touch a Gundogan curler over.
The hosts were again lucky to stay in the game as Lewandowski first shot over and then incredibly put wide moments later after being picked out with a superb pass from Gundogan.
Dortmund’s bench reacted angrily when City chose to play on after Gundogan stayed down after a challenge from Zabaleta, but referee Pavel Kralovec saw nothing untoward.
City boss Roberto Mancini surprisingly opted not to turn to Carlos Tevez in his attempts to snatch a result in the closing stages, instead sending on the unpredictable Balotelli.
It still did not look like being City’s night as they poured forward, with Toure apparently struggling with injury.
Weidenfeller against did brilliantly as he got a hand to a powerful header from Aguero.
City kept the pressure on and gained a very fortunate penalty decision when Aguero hooked the ball towards goal and it struck Subotic’s arm at point-blank range.
Balotelli did not complain and he stepped up to despatch a cool spot-kick into the bottom corner.
The drama was not over and, fittingly, Hart had the final word as he kept out a strong drive from Lewandowski.