RPM Interrupt speed limit

  //Don't process interrupts during calculations
  detachInterrupt(0);

The comment is wrong. Some (maybe even many) interrupts will happen while your interrupt is detached.

  rpm = 30*1000/(millis() - timeold)*rpmcount;
  timeold = millis();
  rpmcount = 0;
  //Print out result to Serial
  Serial.println(rpm);

  //Restart the interrupt processing
  attachInterrupt(0, rpm_fun, FALLING);

Your interrupts are detached for a long time.

Detach the interrupt. Copy the values in rpmcount, now, and then. Reset stuff. Then, reattach the interrupt. Only then, perform the calculations, based on the copies, and print the result.