As you say in your 3 options, only UILocalNotification actually obeys silent / DND mode.
Problems with it can be solved.
Notification Center Spam: I think this works well. You can cancel your previous notification right before you launch it, so there will always be only one outstanding notification.
[[UIApplication sharedApplication] cancelAllLocalNotifications];
Vibration Problem:. You should be able to call it: AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); in the same place where you call your local notification again and again using the timer until the call ends, or users confirm that the call. With background settings, VOIP on it should work in the background.
As you indicated in option 2, the vibration will not follow the Do Not Disturb mode, but it is just vibration. If you spam a notification center that will vibrate once every time a notification arrives, so you may not need to explicitly trigger a vibration if that's enough for you.
Good luck.
source share