Andres Romero also scored for Montreal (9-4-3), just 23 seconds after the opening kickoff.
Di Vaio tied it up a minute later with his 11th goal after Richter's clearing pass ended up on Felipe's boot. The Brazilian midfielder slipped the ball to Di Vaio who scored from in close.
Until Camara's goal, Toronto seemed to be in cruise control after getting three goals in the first half and appeared en route to posting its first league win at home in nearly a year.
Brockie had a chance to put Toronto ahead in the 89th minute but his long-range shot hit the post and deflected wide. And Montreal came close in stoppage time when Caldwell's header back to the goalkeeper almost found an Impact attacker.
Brockie tied the score in the 6th minute and then set up Caldwell's go-ahead goal in the 21st. O'Dea made it 3-1 in the 24th.
Toronto extended its MLS winless streak at BMO Field to 15 games, dating back to a 2-1 victory against Colorado last July 18. The team beat Sporting Kansas City in Toronto in the second game of this season but that was at the Rogers Centre.
Assistant coach Mauro Biello led the Impact in place of head coach Marco Schallibaum, who was serving a one-game suspension -- his third suspension of the season. The Swiss coach was punished for coming on the field during the Impact's home loss to Colorado on Saturday. Impact assistant coach Philippe Eullaffroy was also suspended for one game for throwing the ball in the direction of Rapids midfielder Tony Cascio.