After leading 5-2 in the second set the world number 27 needed five match points to progress to her third final of the season.
She said tearfully after the match: "I've been through so much the past two months, and all I can say is I'm so happy to be back on court... I'm in the final of the Rogers Cup."
"I'm glad it was two sets today, but it wasn't easy. I was so, so nervous, and I just felt like crying after because I'm just so happy. I'd say this is even bigger than winning Indian Wells."
The Canadian will face world number 10 Serena Williams, a three-time winner of the event, in the final.
Williams was forced to rally from a set down in her 1-6 6-3 6-3 victory over Czech qualifier Marie Bouzkova.
The world number 91 had won seven matches in Toronto and challenged Williams over the course of almost two hours.
But the 23-time major champion fought hard after making 18 unforced errors in the first set, finishing with 11 aces in her 500th career WTA win on hard courts.
Williams said: "I just needed to be more consistent and not make so many errors and just mentally be ready to hit a thousand balls if I needed to."
She paid tribute to upcoming opponent Andreescu, who she noted had "won a lot".
"The crowd will obviously be for her ... Luckily, I've had some tough crowds in my career, so hopefully I will be used to it."