The Dutch went 2-1 ahead when defender Kyle Walker turned the ball into his own net after a mistake by team mate John Stones in the 97th minute and Quincy Promes completed the scoring in the 114th after Ross Barkley gave the ball away.
England thought they had scored in the 83rd when Jesse Lingard ran on to Barkley's pass to find the net but he was ruled a fraction offside after a two-minute VAR review.
The Dutch will now face hosts Portugal in Sunday's final in Porto, while England were left to contemplate a fourth successive competitive semi-final defeat following their losses at the 1990 and 2018 World Cups and Euro '96.
Rashford calmly sent Jasper Cillessen the wrong way from the spot in the 32nd minute.
England nearly returned the gift early in the second half when Walker was dispossessed by Memphis Depay but his shot was blocked by goalkeeper Jordan Pickford.
By now, though, the Dutch were in control and, while much of their possession was unproductive, they deservedly levelled with a powerful De Ligt header in the 73rd minute as the 19-year-old atoned for his earlier mistake.
England then produced what they thought might be the winner with a flowing move which started on their own goal line. The ball found Raheem Sterling, who flicked it to Barkley and he slipped it through for Lingard to score.
Seven minutes into extra time, Stones dwelled on the ball on the edge of his area and was dispossessed by Depay, whose shot was brilliantly parried by Pickford.
However, the ball broke loose, Promes got there first and, although he failed to make proper contact, it hit Walker and trickled into the net.
Another England fiasco followed when Barkley's heavy touch from a pass allowed Depay to nip in and he laid the ball off for Promes to seal the deserved Dutch win.