The two sides were locked at 1-1 at the end of 90 minutes and extra-time before the hosts prevailed 13-12 in the shoot-out.
England spent the last 20 minutes of extra-time with 9 fit players having used all 3 substitutes. City's Nedum Onuoha was forced off due to injury while Newcastle defender Steven Taylor could barely walk during the closing stages.
Reading striker Leroy Lita had given England a first-half lead in Heerenveen but Holland claimed an 89th-minute equaliser.
England then survived extra-time before West Ham's Anton Ferdinand hit the bar with England's 16th penalty, and Holland converted the following spot-kick to claim victory.
The hosts will now meet Serbia in the final. England beat an under-strength Serbian side 2-0 in their final group game, which was marred by racist abuse directed at Onuoha and Arsenal's Justin Hoyte.
Onuoha dealt with the provocation admirably and emerged from the tournament as a potential full international. The 20-year-old went in as probably England's fourth-choice centre-half but established himself in the starting line-up alongside Newcastle's Steven Taylor.
"He's an outstanding young man, not just as a footballer," said U21s coach and former City boss Stuart Pearce, who now hopes to be given the U21s job full-time.
"I've got that first-hand knowledge of him and he comes from a great family. He's a credit to the English nation."
England drew 0-0 against the Czech Republic and 2-2 against Italy earlier in the group stage.
City goalkeeper Joe Hart was also named in the squad but did not feature, with Liverpool's Scott Carson first-choice keeper.