The main issue with alists is that the special syntax doesn't work and the notation is so verbose . . . I don't know if the efficiency issues would even come to bear for me.
EDIT: nesting is not behaving as I expect but that may be a product of my own misunderstanding.
I would be careful not to structure data/logic to accommodate a special syntax.
i.e while using:
pipe!todo.1!id
is certainly fancy, writing a function is just as effective and most likely more performant since it doesn't require read de-structuring:
(fetch pipe todo first id)
So I'm suggesting you shape your syntax usage around your data, not your data around your syntax. You can always write a macro to obtain your desired level of brevity.