WATCH the ATP Tour LIVE on beIN SPORTS | via Foxtel, Kayo Sports, Fetch TV and beIN SPORTS CONNECT
Shapovalov wilted under pressure on his serve at the end of both sets as Djokovic claimed a 6-3 6-4 victory, though he felt the encounter was closer than the score suggested.
"The scoreline doesn't give you the right idea of what happened in the match, almost two hours for two sets, it was such a close match," Djokovic said in his on-court interview.
"I just managed to stay mentally composed in the right moments and play my best tennis."
He wrapped up the win with a backhand volley after a Shapovalov double fault handed Djokovic the key break, teeing up a meeting with Medvedev, whom he beat in the 2021 Australian Open final before losing to the Russian in the US Open showpiece later that year.
Fellow former world No.1 Medvedev cruised to a 6-3 6-3 win over compatriot Karen Khachanov.
Medvedev trailed 3-1 in the second set but reeled off five straight games to surge into the last four.
"We didn't play since 2019, that's pretty long," Medvedev said of his reunion with Khachanov.
"Hopefully we can play more matches at later stages of tournaments. It's never easy, I'm happy that I managed to really raise my level, especially at the end of both sets, and I'm really happy to be through to the semis."
Sebastian Korda continued his superb run with a straight-sets win over Jannik Sinner, who was bothered by a hip issue that later forced him to pull out of his doubles match.
Korda pulled away in the second set after a tight first to win 7-5 6-1 and has won 11 of his 14 matches since the start of October.
He will take on Yoshihito Nishioka, who overcame home hope Alexei Popyrin 7-6 (7-4) 6-7 (8-10) 6-2, for a place in the final.