Sergio Aguero sent Spain goalkeeper Iker Casillas the wrong way from the penalty spot on 73 minutes to bring the home side level after Karim Benzema had given Jose Mourinho's side the lead on 10 minutes.
Real had to see out the final 17 minutes with ten men after Alvaro Arbeloa was sent off for collecting a second booking for the foul on Aguero that led to the penalty.
City huffed and puffed, but could not break down Real, who join Borussia Dormund in progressing to the last 16 after the German champions' 4-1 thumping of Ajax in Amsterdam.
Dortmund will win Group D whatever happens in the final round of matches.
City need to overcome Dortmund in Germany and hope that Real down Ajax to have any hope of finishing third in the section and securing Europa League football next year. That looks an unlikely prospect unless Dortmund field a team of stooges in the closing match of the section.
But that is for another night as the inquest begins into why City, one of the wealthiest clubs in the world, have again come up woefully short in Europe's premier club competition.