Kohli made 117 to surpass the ODI century record he had shared with India great Sachin Tendulkar, and Shreyas Iyer clubbed a rapid 105 in a commanding total of 397-4.
New Zealand were then dismissed for 327 despite Daryl Michell’s 134 with paceman Shami taking a sensational career-best 7-57.
The Black Caps had hope of an improbable win during a third-wicket stand of 181 between captain Kane Williamson and Mitchell at the Wankhede Stadium.
Shami, however, all but ended the chase with two wickets in three balls during the 33rd over.
Star batsman Williamson fell for 69 when he flicked Shami — who had dropped him on 52 — straight to Suryakumar Yadav at deep square leg.
And 220-3 became 220-4 when Shami had Tom Latham lbw for a duck.
Shami then went on to better his previous ODI best of 5-18 against Sri Lanka at the Wankhede earlier in the tournament by dismissing Mitchell, Southee and last man Lockie Ferguson.
In Sunday’s final, India will face either Australia or South Africa who play their semi-final on Thursday.
Rohit Sharma (c), Shubman Gill, Virat Kohli, Shreyas Iyer, KL Rahul (wk), Suryakumar Yadav, Ravindra Jadeja, Kuldeep Yadav, Jasprit Bumrah, Mohammed Shami, Mohammed Siraj
Devon Conway, Rachin Ravindra, Kane Williamson (c), Daryl Mitchell, Glenn Phillips, Tom Latham (wk), Jimmy Neesham, Mitchell Santner, Tim Southee, Lockie Ferguson, Trent Boult
HEAD TO HEAD RECORD:
Overall ODIs: Matches 117, India 59, New Zealand 50, NR 7, Tied 1
ODI World Cup: Matches 10, India 4, New Zealand 5, NR 1