Skipper Jack Clifford set up his side's opening try with a strong solo run before finding flanker Matt Hankin on his inside to dive under the posts and England heaped more misery on New Zealand when Anthony Watson intercepted a Jason Emery pass to run 50m to score in the 37th minute.
A Simon Hickey penalty right on halftime limited the damage but New Zealand still went into the break trailing by 12 points.
A determined New Zealand side showed more fight at the start of the second half but England's defence held strong as both teams traded penalties.
Emery finally broke the English defensive line in the 60th minute and a Jade Te Rure sideline conversion made it 23-18. A Te Rure penalty with seven minutes remaining cut England's lead to two before the English closed out the game with a dubious third try.
Video replays were unclear but the TMO awarded the try denying the game a thrilling finish.
Earlier a last-minute try saw Wales book a spot in the final for the first time in the tournament's history with an 18-17 win over South Africa.
South Africa held a 17-11 lead with five minutes remaining before Ashley Evans dived over for the second Welsh try of the game before Sam Davies calmly slotted the winning conversion.