What is the backwards compatibility of blender?
The mesh format has changed. 2.6+ uses BMesh and allows for N-gons (i.e. polygons with more than 4 vertices). 2.49 has only quads.
If you don't save with Save Legacy option, you will get only edges, no polygons!
N-gons will be deleted in 2.49.

The whole API, interface and the major version of Python have changed. No scripts are compatible between 2.5+ and 2.49. (Still, I'm suprised how many 2.x concepts in the API were considered good and made its way further to 2.5+ )

Linked libraries between 2.6+ files actually work in 2.49! You can append and link things from 2.6+ files :)

Many new modifiers were introduced in 2.6+.
If used, you won't get any 'Unknown' warning in 2.49. No, they will be anihillated instead. The same is (sadly) true about new types of nodes... 

Names (of objects, materials) in 2.49 have length limits: 16 characters plus the .001 suffix. Also, no international characters are allowed. If you leave a long name in a 2.6+ file, it will end with [] symbol in 2.49. Editing such name in UI and pressing Enter will 'normalize' it.

2.6+ has no options per polygon (mostly game-related, but not only: like Collision, Invisible, alpha blending mode). In 2.6+ you need to set them per material and use "Blender Game" as the rendering engine.
2.49 will not recognize these settings. Also, 2.6+ will break the per-face mode (a bit field). You have to reset the bit field first:

polygon.mode = 5


to be able to use bitwise operations again, like:

polygon.mode &amp;= ~(Mesh.FaceModes.INVISIBLE)


You will need these operations to recover per-polygon flags with Python.

2.6+ names new UV channels "UVMap" by default, while 2.49 uses "UVTex".
It's not an actual compatibility issue, but remember to name the two objects' channels identically before you join them (Ctrl+J). Otherwise, you will lose UV mapping on one of the objects!

The compatibility is quite good IMO :) taking into consideration how much has changed since 2.49.