At 600ms interrupt wait with disabling interrupts directly at the NVIC, I've gotten the button interrupts almost completely stable. It still triggers the EXTI twice when I run traces, but the second one is luckily ignored. I don't know where the second one comes from.