Because it would require the compiler to treat it as a special case - since String.Empty is a library feature (part of mscorlib) but isn't part of the language, compiler designers have (rightly in my opinion) avoided doing the optimisation.
With regards to whether to use "" versus String.Empty, I always assumed it was because extracting string literals is a common task for localization, and using String.Empty ensures that the localisation team don't have to distinguish between "" meaning no string and "" meaning don't print anything in this label and "" meaning something else - String.Empty is where the string is localization-independently empty.
Also, (str.Length != 0) is the fastest way to check that the string is non-trivial, and avoid (as stevo_ says) passing nulls around.
@stevo: extentions to the compiler are a sure-fire way of making the language unusable. If the C# code at Microsoft is different to the C# code at IBM which is different from every other 14 year old's C# code, then C# degrades from a multipurpose programming language to a nasty java-like scripting language. Optimisations are also something that won't readilly become available for the masses to program, because minor errors in an optimisation routine will mean that the code that is produced will do something different to what source-code says it will do, at which point people's confidence in C# as a language will be undermined.
Everyone thinks that their extention, addon or optimisation is the best - that's why they're writing it (and this is also responsible for how every two-bit piece of software on the internet uses it's own skin and why every download program has it's own integrated browser, media player and takes ages to load). If you let everyone loose with language extentions, you'll wish you hadn't opened that pandora's box long before it morphs into a perl-like PHP with case-insensitivity, using runtime checked variants for everything and having an integrated eval function.