I would give a WHILE clause a try:
Date([Contract Date Start]+ iterno()-1) AS ActiveDate
WHILE ([Contract Date Start]+ iterno()-1) <= [Contract Date End];
You can probably apply the WHILE clause already to your initial Contracts load.
Regarding your question about the performance, this might depend on your specific setting, so just run some tests.