Исходя из требования невозможности блокировки стейт-машины Tornado следует вывод о необходимости создания пула обработчиков пользовательских скриптов (на чем бы они ни были) и управления этим пулом. Планировщик может работать простейшим образом - при старте создается N воркеров, далее, при назначении задания на воркер, он помечается как занятый. Когда пользовательский скрипт отработал, воркер освобождается. Если все воркеры заняты, пользовательские задачи стоят в очереди,
кстати, если с самого начала взять систему, имплементирующую очереди - RabbitMQ, например, то все становится еще лучше - вместо пула обработчиков в приложении создается пул консьюмеров соотв. очереди в RabbitMQ, причем, консьюмеров можно добавлять динамически, не релоадя никакие конфиги торнадо-сервера.
А вот на чем будут написаны сами пользовательские скрипты - это вообще неважно, хоть на VB.