Ronaldo transferred his prolific scoring form for Real Madrid to the international stage, diving to head home an 82nd-minute winner and give Portugal a 1-0 cushion to take to Stockholm for Tuesday's second leg.
France faces missing a major tournament for the first time since 1994 after Roman Zozulya and Andriy Yarmolenko scored second-half goals for Ukraine in a feisty match that saw both teams finish with 10 men.
Kostas Mitroglou's double helped Greece claim a 3-1 win over Romania and tiny Iceland overcame a sending-off early in the second half to hold on for a 0-0 draw with Croatia, keeping alive its hopes of becoming the least populous nation to reach a World Cup.
All four return matches take place on Tuesday, when the 13 qualifiers from Europe will be finalized.
Italy drew 1-1 with Germany and an experimental England side slumped to a 2-0 home loss to Chile in headline friendly matches as the countdown to next year's World Cup begins in earnest.
One of the world's top forwards will be absent in Brazil next summer — and it looks more likely to be Ibrahimovic, not Ronaldo.
The heavily billed showdown between two of the biggest stars — and egos — in football looked like falling flat in Lisbon, only for Ronaldo to take centre stage like he so often does for Madrid.
He dived to glance in a left-wing cross for his 44th goal in 108 international appearances, and almost added another when he headed against the crossbar late on.
Ibrahimovic was largely anonymous in Lisbon and, at the age of 32, could be set to miss out on what would likely be his final World Cup campaign.
Another star of the world game, Bayern Munich winger Franck Ribery, may also be absent in Brazil after France tumbled to defeat in Kyiv on a night that proved to be one to forget for Laurent Koscielny.
The Arsenal defender conceded the penalty that Yarmolenko converted for 2-0 in the 83rd minute, and was then sent off in stoppage time.
Zozulya opened the scoring in the 61st for Ukraine, who had Oleksandr Kucher dismissed soon after Koscielny had been shown the red card.
Iceland, with a population of around 320,000, is seeking a place in a major tournament for the first time but the biggest football match in the Nordic country's history turned sour when Olafur Skulason was sent off for a professional foul in the 51st.
However, goalkeeper Hannes Halldorsson and his packed defence stood firm to repel wave after wave of Croatia attacks in the second half. The 10,000 Iceland fans in the Laugardalsvollur national stadium greeted the final whistle as if their team had won.
Romania appears likely to miss out on World Cup qualification for the fourth straight campaign after conceding twice in the opening 20 minutes before Mitroglou scored Greece's third in the 66th to give the 2004 European champions a strong advantage to take to Bucharest.
Bogdan Stancu had equalized in the 19th for Romania, which had substitute Costin Lazar sent off for a second yellow card in stoppage time.
Italy maintained its proud record of not having lost to Germany since 1995 — but needed a 28th-minute equalizer by Ignazio Abate to preserve that run.
Germany took the lead in the eighth minute through Mats Hummels and twice hit the goal frame in Milan.
In another match between two World Cup qualifiers, Chile ended England's 10-game unbeaten run thanks to Alexis Sanchez's double at Wembley Stadium.
The Barcelona forward scored in the seventh minute and again in second-half injury time to deliver a reality check for England, which gave three players debuts.Suggest a correction