Control-C handling in Python and Trio
vorpus.org
vorpus.org
(It turns out that while you "shouldn't" do POSIX IO from a signal handler, on Linux this works fine 99% of the time so you can write() a menu and read() the input character before deciding whether to stop your program cleanly or uncleanly.)
That seems like it could solve this issue, as the handler itself could tell if it were in trio code, and register a deferred exception only in that case, before the stack was ever unwound.