McCullum played 44 balls and slammed six boundaries and three sixes to get his 64 runs while Karthik slamnmed 48 runs off 26 balls that helped Gujarat to post a decent score.
It was a poor start by the Gujarat as the visitors lost their first wicket on the second ball of the innings.
Dwyane Smith (0) was caught by Nitish Rana at the backward point off pacer Mitchell McClenaghan with just one run on the board.
Incoming batsman Suresh Raina (28) along with McCullum then stabilised the innings as two batsmen forged an 80-run partnership for the second wicket.
Just when things seemed going good for the visitors, skipper Raina, who was playing sensibly at the crease by rotating the strike, was sent packing in the 12th over by off-spinner Harbhajan Singh. Raina's 29-ball knock had only two boundaries.
After one over, McCullum was also sent back to pavilion by experienced pacer Lasith Malinga. While trying to flick on the leg side, the ball sneaked between bat and pad of McCullum and hit the stumps.
With scoreboard reading 99/3, middle order batsmen Ishan Kishan (11) and Karthik then faced up to the challenge and scored 54 runs in four overs to help Gujarat get past 150-run mark before Ishan was taken by McClenaghan in the 18th over.
The fall of wicket brought in Jason Roy (14), who supported Karthik at the other end with some good strokes and thus Gujarat finished at 176/4 in their allotted 20 overs.
For Mumbai, McClenaghan scalped two wickets while Malinga and Harbhajan chipped in with a wicket each
Top 10 Batsmen with most Sixes in IPL 2017
Big hits of IPL-10
2 bookies arrested during IPL final, 77 mobiles recovered
David Warner wins IPL 2017 Orange Cap
Ben Stokes won the Most Valuable Player of IPL 2017 Award
IPL 2017: Special Awards
Disappointed to lose in the final says Smith
Kieran Pollard hails Mumbai team's character after IPL triumph
Mumbai Indians won by 1 run to clinch the IPL-10 title (Full Scorecard)
Mumbai beat Pune to win IPL