Hola,
Bajo mi punto de vista tu problema es donde realizas la asignación del tiempo.
previousMillisSMS9 = tiempo;
Lo haces después de enviar el mensaje de recordatorio, yo creo que tendrías que poner esa linea en el if donde se dispara la alarma ya que es en ese momento cuando tienes que contar el tiempo para enviar el recordatorio.
Tu problema que dices que es aleatorio yo creo que realmente sucede si hay una segunda incidencia y entre ambas a trascurrido mas de del tiempo para el reenvío.