@strizhechenko доехал домой, добрался до репла питона, проверил.
В общем случае, SIGINT у тебя вызывает KeyboardException в текущей исполняющейся строке питона.
Для asyncio есть несколько вариантов развития событий, в зависимости от того, чем занимается луп прямо сейчас.
Вариант 1: луп исполняет какой-то синхронный код. Тогда это исключение вылетит на этот синхронный код, провалится наверх до gather'а, и дальше в зависимости от параметров gather'а будет обрабатываться.
Вариант 2: луп что-то ждёт. В этом случае оно прилетит в сам луп, и луп тебе отменит все корутины, какие найдет (в том числе все таски твои).
В итоге await gather кинет исключение и оно поедет наверх.
Вот на этом можно поиграться: https://yaso.su/dAlePnTi
Учитывай, что CancelledError наследуется от BaseException, и через обычный except Exception его не поймать.