MASH can do delay effects too if that is all you are really trying to do. It also has a Python solver. It might not be any faster than an expression, but it is Python, which is nice. I only did brief tests. You can sample time with Python commands in this solver. It can import any module you like.
Expressions can definitely get slow, but they can also be very useful. A lot of studios like to avoid things without question because they experienced some pain in the past. It's best to test if you have the time. It is also possible to evaluate expressions on-demand instead of every frame, depending on your needs.
I'm also doing something time-based, and considering using frameCache vs. a GUI tool that the animators can call on-demand. They animate, then just hit "go" and it solves the motion. If they update the animation, they have to run it again. Not sure which route we'll take yet.