Thorgan Hazard’s first-half goal gave Belgium a tense win over the holders to set up a quarter-final tie against Italy at Euro 2020.
Belgium held on despite losing skipper Kevin De Bruyne to injury in the second half and will face the Italians in Munich in the last eight on July 2.
Cristiano Ronaldo tested Thibaut Courtois with a dipping free-kick in the first half but the 36-year-old neither broke the international goals record nor added to his five for the tournament.
Raphael Guerreiro went closest to a late equaliser when his shot came back off the post but Belgium were the braver, more fluid team and deservedly edged through.
They will now face Italy in Munich on Friday and possibly without Kevin De Bruyne, who hobbled off injured in the second half but returned to the pitch to join the celebrations at the end.
For all the superstar names on the pitch, it was Eden Hazard’s less heralded brother Thorgan who proved decisive, the Borussia Dortmund winger who Eden once said had even more talent than him.
Portugal, meanwhile, stuck to the defensive approach that served them so well in France five years ago but has perhaps been outgrown by a side that now boasts some of the most creative technicians in the world.
De Bruyne injury worry
Eden Hazard started in Belgium’s front three again after playing 90 minutes against Finland on Monday. Portugal’s Diogo Dalot came in at right-back for the injured Nelson Semedo.
Eden Hazard skied an early shot over after a neat exchange with Romelu Lukaku while Diogo Jota skewed wide, slipped in down the left by the impressive Renato Sanches.
Ronaldo cut an isolated figure up front, his every touch booed early on by the Belgian fans, who then cheered when he was robbed of the ball before being bumped to the ground by Thomas Meunier.
The closest Ronaldo came to an all-time record 110th international goal was a dipping free-kick from 30 yards which Courtois parried away while at the other end, Lukaku was a more dynamic force.
One scintillating break saw Lukaku tear through Portugal’s midfield and with his shirt being pulled behind him, he was just lacking the final pass to Hazard.
An untidy game found its moment of clarity in the 42nd minute. It started with Courtois coolly evading Ronaldo’s press before more excellent work from Lukaku allowed De Bruyne to switch left to Thorgan Hazard.
Hazard cut in and ripped a swerving shot that rocketed towards the centre of the goal before swerving right and past Rui Patricio, who was too slow to adjust.
Belgium played with more verve after half-time and looked set to take charge.
But De Bruyne’s injury checked their rhythm and Portugal came again, Jota firing over and Joao Felix, on as a substitute, heading into the hands of Courtois.
Tempers flared as a crescendo of collisions incensed the crowd and left Pepe lucky only to be booked after he led into his challenge with his arm.
Portugal finally had to push and in a wild last 10 minutes, Guerreiro went closest to an equaliser, his shot hammering against the post. Belgium did just enough.