I fly out of Montreal and usually use Air Transat. It is my sense that their prices are a bit lower than Air Canada or Air France. They fly directly to Porto from Montreal. You can also buy a multi-city ticket without additional cost enabling you to fly into Porto and to return from Madrid (or another city).
They also fly from other Cdn cities (Toronto and Vancouver).
Coming from Vancouver on the North American west coast, and travelling to Portugal quite regularly, we've settled on using Air Transat through Montreal almost exclusively.
1/ it breaks the flight almost in half (Vancouver>Montreal about 5 hours; a 1 1/2 hour layover in Montreal; Montreal>Lisbon about 6 1/2- 7 hours.)
2/ Montreal is a much pleasanter, smaller, and easier-to-navigate airport than Toronto, the other major hub from Canada to Portugal.
This time, we have arrived via Lisbon and will fly back from Porto, just for a change...since we're about 1 hour by train from Lisbon and 2 hours from Porto. Air Transat rates, as mentioned above, seem to be the same for an open-jawed flight like this.
Their service is good; their seat spacing is not bad, for an economy flight. They seem very reasonable to deal with.
I should add that this time, for the first time in many years, we used a real-live travel agent rather than doing the online booking ourselves. From my invoice, it seems to have cost me $20 Canadian on top of the plane fare for this service. I think well worthwhile! All the airlines are very difficult to reach right now, for flight changes, etc. I'm going to leave that to someone else, if it has to be done.
Bom caminho!