The first half was quiet, with no major incidents at either end of the pitch. Marco Asensio fired a shot well over the bar and Isco sent a free kick the same way, before Madrid's best chances saw Rodrygo have a shot blocked and Karim Benzema's effort was saved by goalkeeper Claudio Bravo.
Rodrygo hit the bar in the second half with what looked like an attempted cross, while Betis passed up a series of presentable scoring chances and Thibaut Courtois saved well from Borja Iglesias. Luka Modric had a shot saved, and substitute Eden Hazard combined well with Benzema, but Madrid were left frustrated at the final whistle.
Real Madrid's defence is looking solid as they go into their Champions League semifinal first leg with Chelsea. They've kept clean sheets in their last four consecutive games, and welcomed back Dani Carvajal here from injury, too. They'll need that defensive strength if they're to win a trophy this season, although it will need to be coupled with offensive firepower.
As well as the return of Carvajal, this game also saw Hazard back on the pitch for the first time in six weeks. There have been many false dawns now, and no-one will be getting overexcited about his impact going forward, but his presence is welcome at least.
There was a lack of invention, verve, spark and dynamism here, which is unsurprising given the unrelenting demands on the team. The likes of Toni Kroos and Federico Valverde were absent in midfield, each offering very different qualities of passing quality and energetic workrate, but both equally missed.
This was Real Madrid's third 0-0 in four games in all competitions, which is the kind of toothless run we just don't tend to see from this team. If Karim Benzema isn't firing on all cylinders, as was the case tonight, there just aren't enough goal scoring alternatives in the squad.
Manager rating out of 10
7 -- Zinedine Zidane had one or two decisions to make here, opting for Nacho Fernandez at left-back ahead of Marcelo, and resting Vinicius Junior, while Hazard was fit enough for a place on the bench.
As the team looked for a goal, Zidane was proactive, bringing on Marcelo and Alvaro Odriozola and switching to three at the back as well as introducing Vinicius Junior and Eden Hazard, but it wasn't enough.
Player ratings (1-10; 10 = best. Players introduced after 70 minutes get no rating)
GK Thibaut Courtois, 7 -- Made a really important second-half stop from Iglesias, and kept another clean sheet.
DF Dani Carvajal, 6 -- Back from injury just in time for some big games coming up, and played over an hour.
DF Raphael Varane, 7 -- Strolls through games like this, looking confident and composed throughout.
DF Eder Militao, 7 -- Has done such an impressive job filling in for Sergio Ramos. Handled Betis centre-forward Borja Iglesias really well.
DF Nacho Fernandez, 6 -- Out of position at left-back given that he prefers to play centrally or on the right, but did pretty well against the pacey Diego Lainez.
MF Luka Modric, 7 -- Back after missing the Cadiz game. Enjoyed one ice-cold dummy and turn to escape the attentions of Iglesias in the first half. Also had a second-half shot saved.
MF Isco, 6 -- Wasted a promising early free kick, and was booked for a foul on Miranda. Did pull off one glorious first-half through ball for Benzema, though.
FW Marco Asensio, 6 -- Made one promising first-half cross from the right, but otherwise very quiet.
FW Rodrygo Goes, 7 -- Had a dangerous early effort blocked, and then struck the bar with a mishit cross in the second half. Subbed off early.
FW Karim Benzema, 7 -- Any Real Madrid goal threat looked like coming through him. The Frenchman had one first-half shot saved, and was wrongly flagged offside later but missed the target anyway. Unable to add to his 21 league goals.
FW Vinicius Junior, 6 -- Introduced early to bring some energy to the team, yet made just one wild shot wide.
DF Marcelo, 7 -- Always offers the team something going forward.
DF Alvaro Odriozola, 6 -- Brought on at wing-back as Madrid switched their shape.
FW Eden Hazard, NR -- His first minutes since coming off the bench against Elche six weeks ago.
MF Antonio Blanco, NR -- A late replacement for Modric.