A lot of games use an open source application called Mappy. It has its own format that supports multiple layers and other features. You probably want to associate several types of data with a given tile.
I think the in-game level editor approach is very common. Developer Mode is an inside account of how the levels for a very popular game, Braid, were designed. The game has a development mode where levels can be constructed/modified. The levels themselves have a collision layer covered up with graphical tiles:
And I personally don't recommend it, but a 2D demo program for Allegro used some type of 3D modeling format and converted it to a custom in-game format. The advantage was it could model very smooth, continuous surfaces. (It was a 2D physics-based skate boarding game.)
To edit the level data of the Allegro
demo game, we use the free and open
source tool Blender. You can obtain it
here:
http://blender.org
Here are step by step instructions how
it works:
1) Place the file ademo_export.py into
your Blender scripts folder. It is the
export script which will convert from
.blend format to the .txt format used
by the demo game. Under unix, the path
will be:
~/.blender/scripts/ademo_export.py
2) Load the .blend file blender. Under
unix, type this from the directory
with the level.blend file:
blender -w level.blend
(The -w is to use windowed modes,
which I prefer.)
3) Edit the level. In the menu, under
Help -> Scripts Help Browser -> Export
-> Allegro Demo Game Level
you will find some useful tips.
4) Save the file (use compression
before committing). Export it as .txt
from the export menu, choosing Allegro
Demo Game Level.
5) Update level.dat using level.txt,
the new level should appear in the
game.