Using Timers instead of delays

Try this:

unsigned long startTime = millis();
unsigned long myDelay = 1000; // 1 second. Change to whatever delay you want
int state = 1;
      if(buttonPushCounter ==0 && currentgear == '2' && previousgear == '1' ) {
      while(state < 5){
         switch (state){
           case 1:
              if (millis()-startTime >=myDelay){  //has time elapsed?
                      Serial1.write("\x10\x40\x87") ; //yes
                      startTime = millis();  //reset startTime for next output
                      state++; //go to next state
             }
             break;
           case 2:
              if (millis()-startTime >=myDelay){
                      Serial1.write("\x10\x40\x88") ;
                      startTime = millis();
                      state++;
              }
              break;
           case 3:
              if (millis()-startTime >=myDelay){
                      Serial1.write("\x10\x40\x89") ;
                      startTime = millis();
                      state++;
              }
              break;
           case 4:
              if (millis()-startTime >=myDelay){
                      Serial1.write("\x10\x40\x32") ;
                      startTime = millis();
                      state++;
              }
              break;
          default:  //you should never get here
            state = 1;  //reset to start, just in case!
            break;
         }
    }
}