In the clash of the former Auckland winners, Juan Martin del Potro defeated David Ferrer by 6-4 6-4 in an hour and 45 minutes, advancing to his 30th ATP final.
He cruised through a first-set tiebreaker after both players could not break serve, before seizing the initiative at the start of the second set.
Like the dynamic Ferrer, del Potro also managed to keep himself in the hunt, saving six break points and frustrating the Spaniard with his staying power.
The two tour veterans last played in 2016, when del Potro knocked Ferrer out of the US Open in straight sets, and previously at Wimbledon in 2013.
On the other side of the draw, Ferrer's compatriot Roberto Bautista Agut appears a safe bet for the final, drawn for a semi against Dutchman Robin Haase.
"It was a great finish and when I saw that last ball in I went insane", Bautista Agut said.
In preparation for the Australian Open, starting January 15, Del Potro proved just too strong for the Canadian and won 6-2, 6-4.
With top seed Jack Sock eliminated earlier in the day by unheralded German Peter Gojowczyk, del Potro is a red-hot favourite to lift his first Classic title since 2009.
The 18-year-old Shapovalov, considered one of the finest young talents in world tennis, admitted he was still a level off the likes of del Potro.
"Today was a very tough match, I don't know how my body will be tomorrow, but now I want to enjoy the win and we'll see", Bautista Agut said.
"I tried to not make mistakes, play in the right places, try and play as hard as possible with all the pressure", Bautista Agut said of the third-set tiebreak.
But he'd look to recover quickly for a tilt at the final.
In the doubles, Belarusian Max Mirnyi and Austrian Philipp Oswald will take on Austrian Oliver Marach and Croatian Mate Pavic.