I can't speak for the other popular languages (or environments, such as ADRIFT, http://www.adrift.org.uk/), but my experience with TADS 2 was interesting and frustrating.
I found the parser to be rich and powerful, but the parse logic was sometimes difficult to modify.
Creating a game in TADS felt like hand-coding a big, interconnected serialized object graph. There seemed to be a lot of repetition and verbosity, which made individual instances readable in the code, but made coding many items, actors, and locations very tedious and hard to keep consistent.
There is a notion of classes and inheritance, which I found familiar and useful.
I experimented with dynamically creating actors at runtime (random people with different appearance and behavior). This doesn't seem to be the standard TADS style, and requires extra bookkeeping to manage the new entities for the sake of the parser.
It seemed to me that code generation would help, particularly extracting inter-object references into concise tables.
I missed the ability to unit test code (spoiled by JUnit!). It was possible to script the interpreter with text file as input and capture the output, however. There is also a debugger which never worked well for me (partly a split-screen terminal problem).
I'll peek at TADS3 and see if it feels more accessible to me.