Uruguay international Cavani had been restricted to appearances off the bench after sustaining a hip injury in August but was chosen from the start by head coach Thomas Tuchel.
However, the striker struggled to make an impact against a spirited Brest side, with Icardi scoring the winner just five minutes after replacing his team-mate.
Samuel Grandsir had earlier cancelled out Angel Di Maria's opener for PSG, who recovered from the setback to secure victory and ensure they did not drop points for a second consecutive Ligue 1 game, having suffered a shock defeat to Dijon last time out.
Still, PSG were again below par, with goalkeeper Sergio Rico – handed a first start as a late replacement for Keylor Navas – called into action after 15 minutes to paw away Mathias Autret's drive.
Brest goalkeeper Gautier Larsonneur pushed away Pablo Sarabia's whipped effort soon after before Yoann Court flashed a half-volley into the side netting from a promising position.
Despite being on the back foot for much of the first half, PSG forged ahead after 39 minutes. Julian Draxler released Di Maria and the Argentina international clipped his finish over Larsonneur, the goal given after a VAR review showed he had remained onside.
Cavani scuffed an effort straight at the Brest goalkeeper at the start of the second period, with PSG belatedly showing more attacking intent than they did during their laboured first-half display.
It looked like they would once again drop points on the road, though, when substitute Grandsir powered an effort through Rico following a swift counter-attacking move in the 72nd minute.
Cavani was replaced by Icardi with 10 minutes remaining and the replacement had the desired impact following his introduction, bundling home from close range to seal a scarcely deserved triumph.
What does it mean? PSG struggling to find their groove
PSG did not play much better than in their defeat to Dijon last time out, though Tuchel will at least take comfort from the fact they were able to return to Paris with all three points.
They sorely missed the spark of the absent Kylian Mbappe in attack and look some way off the side that has swept all before them in French football over the past few seasons, despite their Champions League displays this term.
Di Maria shines again
The 31-year-old has been in superb form this season and once again illustrated his importance to PSG, putting his side ahead with a finish of the highest order.
Cavani's comeback does not go to plan
Given how quickly Icardi has taken to life at PSG, Cavani will have known the importance of making a bold statement on his return to the starting XI. He looked badly off the pace, though, and could only watch on as his fellow frontman made the decisive intervention late on.
3 – Paris are the 3rd team to have 4 different starting goalkeepers (Areola, Bulka, Navas & Rico) in their first 13 matchdays of a Ligue 1 campaign over the last 50 seasons, after Troyes in 1977/78 and Monaco in 1995/96. Turnover. #SB29PSG pic.twitter.com/uYDqh4C93L— OptaJean (@OptaJean) November 9, 2019
Key Opta facts
- Brest have lost their last two games in Ligue 1 (0-1 at Amiens and 1-2 v Paris), as many as in their first 11 this season (W4 D5).
- PSG have found the net in each of their last 26 away league games. Snly Sedan, between 1957 and 1959 (32), have done better in the history of the top flight.
- Samuel Grandsir has scored two goals in his last eight games in Ligue 1, matching his tally in the previous 60.
- Angel Di Maria has been involved in 10 goals in Ligue 1 this season (5 goals, 5 assists), including six in his last four Ligue 1 outings (3 goals, 3 assists).
- Mauro Icardi has scored one goal every 17 touches in Ligue 1 (5 goals from 84 touches) - that is the best rate among players with 2+ goals in the top five European leagues in 2019-20.