Rotary encoder strange behaviour

You are doing way too much and in the wrong place.

For example you don't need to do this bit every time round the loop:-

// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  //some variables we need
  byte block;
  byte len;
  MFRC522::StatusCode status;

Stuff like this needs to be done once only so do it in the setup function, and those byte definitions should be outside any function so they are global variables.

// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( mfrc522.PICC_IsNewCardPresent()) {



    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
      return;
    }

    Serial.println(F("**Card Detected:**"));

Really every time round the loop.
Remove all delays - you said it didn't make any difference so why have them. It actually does though.
Remove all print statements, printing takes time and you do not have it.

Basically you are spending too long between calls to encoder.tick() so try and think about what your code is doing. Break things up into functions, do you have to check for a new card as often as an encoder change - well no every second or two is enough.

Software serial is also slow and eats time, try and use an Arduino with a spare serial port, like a Micro, mega or Leonardo.

Be aware of how often you need to do things and only do them as often as you need.

P.S. It is universally true here that if someone mentions "strange behavior" the behavior turns out to be exactly as expected.