//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.