Beaten by Crutchlow at the previous events, seventh on the grid Dovizioso passed the Englishman on the brakes into turn one on lap 5 and edged several seconds clear by the closing stages of his third M1 race.
Alvaro Bautista enjoyed his best ride for San Carlo Honda Gresini, repeating his sixth on the grid at the finish, as the Spaniard held off Valentino Rossi by almost five seconds.
Seventh place, from ninth on the grid, made Rossi the top Ducati and - despite finishing 26sec from Stoner - it was the Italian's best race performance of the year so far.
By contrast, Lorenzo's Yamaha team-mate Ben Spies went backwards for the third race in succession, sinking from fifth on the grid to a low of ninth, having run wide early in the race.
The Texan regained a place for eighth at the flag, which is still his best result of the year after eleventh places in the previous events.
Honda LCR rookie Stefan Bradl was ninth, after swapping places with Spies in the second half of the race, while Pramac Ducati's Hector Barbera took tenth and Rossi's team-mate Nicky Hayden a disappointing eleventh.
15 of the 20 riders starters reached the flag, with Aleix Espargaro beating sore Aspar team-mate Randy de Puniet by almost three-seconds to be the top CRT in twelfth.
Michele Pirro (Gresini) and Danilo Petrucci (Ioda) completed the finishers, all of whom were rewarded with at least a point.
Forward Racing's Colin Edwards broke his collarbone in an incident involving de Puniet on Saturday and is due to undergo surgery in Barcelona on Monday.
Estoril is rumoured to be dropping off the MotoGP calendar after this year's event and Sunday's race took place in front of a packed crowd of just under 50,000 - many attracted by rock-bottom ticket prices.
A test session will be held back at Estoril on Monday, with the French MotoGP at Le Mans then taking place on May 18-20.
Portuguese Grand Prix:
1. Casey Stoner
2. Jorge Lorenzo
3. Dani Pedrosa
4. Andrea Dovizioso
5. Cal Crutchlow
6. Alvaro Bautista
7. Valentino Rossi
8. Ben Spies
9. Stefan Bradl
10. Hector Barbera
11. Nicky Hayden
12. Aleix Espargaro
13. Randy De Puniet
14. Michele Pirro
15. Danilo Petrucci