Eden Hazard made his comeback for Real in a strong side. The Belgian attacker had been out since late November after picking up an ankle injury in the 2-2 draw against Paris Saint-Germain in the Champions League and had missed Los Blancos’ last 16 games in all competitions.
Despite some neat passing from the home side early on, Celta took a surprise lead after just seven minutes when Fedor Smolov ran onto a through-ball from Iago Aspas, found his way between Raphael Varane and Dani Carvajal and beat Thibaut Courtois from just inside the area.
Zinedine Zidane’s side had most of the possession for the remainder of the half, but their build-up play was slow and predictable.
Madrid were slicker after the break and thought they had levelled when captain Sergio Ramos volleyed home from a Gareth Bale cross, but the strike was ruled out for offside.
Toni Kroos did equalise after 52 minutes as he curled a left-footed drive past Ruben from just inside the area.
Benzema then put Hazard through and the Belgian was brought down needlessly by Ruben. The referee awarded a penalty and Ramos made no mistake from the spot to give Los Blancos the lead.
Zidane sent on Ferland Mendy and moved Marcelo in midfield in an attempt to close out the game, but substitute Santi Mina struck four minutes before the end after latching onto a fine ball from Denis Suarez and Celta held on through five minutes of added time to claim a valuable point.
Madrid are now just a point clear of rivals Barcelona at the top of the table with 24 games played.
The Galicians move out of the relegation zone and are now 17th, still level on points with 18th-placed Mallorca.
Real Madrid XI: Courtois; Carvajal, Varane, Ramos, Mendy; Casemiro, Valverde, Kroos, Modric; Isco; Benzema
Celta Vigo XI: Blanco; Murillo, Araujo, Aidoo; Vazquez, Yokuslu, Beltran, Olaza; Rafinha; Aspas, Smolov