The Red Bull junior came out on top in a frantic scrap for the lead in the opening laps, as he, race-one winner Stoffel Vandoorne and Magnussen all traded places at the front.
Vandoorne snatched the lead from polesitter da Costa at the start, but da Costa grabbed it back with a pass at the first chicane on lap two.
Fortec driver Vandoorne had skipped the second part of the chicane after trying to defend on the brakes, and he fell behind da Costa and Magnussen on the exit.
Da Costa then fended off an attack from Magnussen into the second chicane, only to give the Dane a chance by running wide on the exit of Lesmo 2.
Magnussen waited until the Parabolica to make his move, swooping around the outside to take the lead.
But his time at the front was short-lived, as da Costa passed him on the outside into Turn 1.
From then on the top two pulled away from Vandoorne and the chasing pack, with Magnussen never letting da Costa's lead above 1.2 seconds.
But the leader did not put a wheel wrong under all that pressure, while Magnussen had to back off on the penultimate lap and take second after his sidepod started to come loose.
Vandoorne took a lonely third, while Arthur Pic put in a charging drive from 16th on the grid to take fourth ahead of Nico Muller.
Oliver Webb was on course for sixth place, but he toured across the line in ninth with damage to the left rear of his car.
Results - 29 laps:
Pos Driver Team Time/Gap
1. Antonio Felix da Costa Arden Caterham 46m24.405s
2. Kevin Magnussen DAMS + 2.767s
3. Stoffel Vandoorne Fortec + 5.922s
4. Arthur Pic AV Formula + 11.600s
5. Nico Muller Draco + 16.805s
6. Norman Nato DAMS + 28.467s
7. Pietro Fantin Arden Caterham + 29.106s
8. Christopher Zanella ISR + 37.524s
9. Oliver Webb Fortec + 41.314s
10. Mihai Marinescu Zeta Corse + 51.737s
11. Nigel Melker Tech 1 + 52.018s
12. Marlon Stockinger Lotus + 52.250s
13. Andre Negrao Draco + 52.921s
14. Mikhail Aleshin Tech 1 + 1m01.439s
15. Yann Cunha AV Formula + 1m06.629s
16. Carlos Huertas Carlin + 1m09.426s
17. Emmanuel Piget Zeta Corse + 1m11.811s
18. Marco Sorensen Lotus + 1 lap
19. Sergey Sirotkin ISR + 3 laps
20. Zoel Amberg Pons + 3 laps
Daniil Move Comtec 23 laps
Will Stevens P1 17 laps
Nikolay Martsenko Pons 17 laps
Jazeman Jaafar Carlin 6 laps
Lucas Foresti Comtec 0 laps
Matias Laine P1 0 laps
The 2015 Formula Renault 3.5 season will be notable for being the last with the French company's backing but also produced a worthy champion in Oliver Rowland. PETER MILLS evaluates this year's crop of drivers
Last year's field was extraordinary and hard to match, but the Formula Renault 3.5 grid will still have plenty of talent this season. Glenn Freeman runs through the field ahead of this weekend's season opener
Landing the Fortec seat that took rising star Robin Frijns to the 2012 FR3.5 title was already a good sign for Stoffel Vandoorne. Then McLaren took him under its wing. Peter Mills tells Vandoorne's story so far