The ART driver held off Racing Engineering's Julian Leal by just 0.4 seconds.
Calado, who had a fresh set of prime tyres available for this race by dint of starting on the soft on Saturday, streaked into an early lead from pole position. By lap five, he was three seconds clear and looked to be cruising to victory.
But Leal began to make inroads into his advantage, and by lap 12 the gap was under a second.
In the closing stages, Calado had to keep a wary eye on Leal, who was never quite close enough to make a passing move but would have pounced if Calado made a mistake.
Adrian Quaife-Hobbs also joined the lead battle in the closing stages, but asked a little too much of his tyres with a few laps to go and could not quite get on terms with Leal.
Stephane Richelmi was a very distant fourth, ahead of Fabio Leimer and Jolyon Palmer.
Johnny Cecotto Jr took seventh from Tom Dillmann with a couple of laps remaining, while Dani Clos should have been in the mix for points, but was given his second drive-through penalty of the weekend for a collision.
1. James Calado ART Grand Prix
2. Julian Leal Racing Engineering
3. Adrian Quaife-Hobbs Hilmer Motorsport
4. Stéphane Richelmi DAMS
5. Fabio Leimer Racing Engineering
6. Jolyon Palmer Carlin
7. Johnny Cecotto Arden International
8. Tom Dillmann RUSSIAN TIME
9. Felipe Nasr Carlin
10. Mitch Evans Arden International
11. Simon Trummer Rapax
12. Sergio Canamasas EQ8 Caterham Racing
13. Nathanaël Berthon Trident Racing
14. Sam Bird RUSSIAN TIME
15. Marcus Ericsson DAMS
16. Daniel Abt ART Grand Prix
17. Daniel De Jong MP Motorsport
18. Vittorio Ghirelli Venezuela GP Lazarus
19. Dani Clos MP Motorsport
20. Rene Binder Venezuela GP Lazarus
21. Jake Rosenzweig Barwa Addax Team
22. Alexander Rossi EQ8 Caterham Racing
23. Stefano Coletti Rapax
24. Ricardo Teixeira Trident Racing
25. Rio Haryanto Barwa Addax Team