16/32-bit apps. 16-bit apps won't run at all and 32-bit apps will be highly limited.
Kernel and services calls. The kernel changed rather drastically from 2003 to 2012, and there were many fixes to services such as .Net. One patch can often break an app.
Modernizing apps. An app written for Server 2003 might have been accessible via a VPN. Now you have mobile users with iPads who don't use VPNs. So modernizing your app for the mobile world might be especially hard.
Apps with heavy dependencies. If they have a lot of connections to other machines or apps or services, then you not only have to migrate the app but everything it touches and that might take a while to get a thorough map of interconnections.