Kohli's record ton and Shami's seven power India to World Cup final
Kohli's 117 and a blistering 105 from Shreyas Iyer helped India post 397 for four wickets after they won the toss at the Wankhede Stadium, where the hosts had lifted their second and last 50-over World Cup trophy in 2011.
In reply, New Zealand, who beat India at the same stage in the 2019 tournament, were bundled out for 327 in the 49th over with Daryl Mitchell's excellent innings of 134 proving to be in vain.
Australia and South Africa meet in the second semi-final at Kolkata's Eden Gardens on Thursday, with the final on Sunday in Ahmedabad.
Mitchell added 181 for the third wicket with Kane Williamson to keep the Black Caps firmly in the chase but Shami, who sent back both openers, returned to dismiss the New Zealand captain and Tom Latham in one over to put India on top.
The right-handed Mitchell suffered cramps after getting past his hundred but continued to plunder runs with Glenn Phillips during a 75-run stand before the latter fell for a 33-ball 41.
The target ultimately proved too steep, however, as the Indian juggernaut rolled on for their 10th win in as many matches in the 50-over showpiece.
Shami finished with figures of seven for 57, his third five-wicket haul in the tournament.
Kohli's knock, which came off 113 balls, gave him the record for the highest number of centuries in the 50-overs format of the game, taking him past Sachin Tendulkar, the Indian batting great who was in the stands to applaud the feat.
After scampering two runs off fast bowler Lockie Ferguson to get to his mark, Kohli took off his helmet and bowed to the stands where television cameras showed Tendulkar and former England soccer captain David Beckham standing and clapping in appreciation.
He hit nine fours and two sixes before holing out in the deep off fast bowler Tim Southee, who took three wickets for 100.
Iyer's blistering 105, which came off 70 balls and was studded with four fours and eight sixes, provided the late fireworks for India.
India captain Rohit Sharma, who made 47, gave the hosts a rollicking start in a 71-run opening stand with Shubman Gill.
Gill retired hurt due to leg cramps but returned to resume his innings and finished unbeaten on 80.