New optiboot; beta testers welcome...

Yeah, it works as long as you don't try and overwrite code that is currently being executed (causes a crash) - provided that you write all data on a page. Also, if you need to set bits from 0 to 1 in a byte, you have to back up all flash that is on that page, erase the whole page, and then rewrite in all but the byte you wanted to change bit in. Fortunately is a byte is 0xFF to begin with, it is easy to write to by simply writing that byte to what you want, and all others on the page to 0xFF (leaves them unchanged as it can't program from 0 to 1).
This is what I came up with the make it work:

//In optiboot.c
const unsigned char ver[4] __attribute__ ((section (".version"))) = {0xFF, 0xFF, OPTIBOOT_MINVER, OPTIBOOT_MAJVER};

typedef union {
    uint16_t integer;
    uint8_t array[2];
}twoByte;

void tinyTuner() __attribute__ ((naked)) __attribute__ ((noreturn));

...
//At the end of tinyTuner().

  uint16_t addrPtr;  
  //For this code we are assuming that the cleared value of each byte in the temporary page buffer is 0xFF
  //This is important as we have to write a page at a time which means that we will be overwriting bytes we
  //don't want to change - by using 0xFF this isn't an issue as programming can only convert a bit from a 1
  //to a 0 (otherwise it needs to erase which is not being done here). So if say you had 0b00100101, and reprogrammed
  //it with 0b11111111, the result would be 0b00100101 as none on the 0's can be turned into 1's. 
  addrPtr = (uint16_t)(void*)ver; //get the pointer to the ver array in the flash memory.
  
  SPMCSR = CTPB; //clear the temporary page buffer - this sets all bytes to 0xFF so as not to change any bytes we don't want to
  twoByte oscProg;
  oscProg.array[1] = OSCCAL; //store the new OSCCAL value in the program memory so it can be restored by the bootloader at startup.
  oscProg.array[0] = (uint8_t)0x00; //tells the bootloader not to call tinyTuner again (good as it will be overwritten by bootloader later.
  __boot_page_fill_short((uint16_t)(void*)addrPtr,oscProg.integer); //store the two oscProg bytes to the temporary buffer
  __boot_page_write_short((uint16_t)(void*)addrPtr); //program the whole page. Any byte where temp=0xFF will remain as they were.
  boot_spm_busy_wait(); //wait for completion
  
  putstr_t(PSTR("Removing call to TinyTuner to reduce bootloader size by 2.3kbytes\r\n"));
  
  addrPtr = (uint16_t)(void*)bootloader; //get the page on which to bootloader starts;
  addrPtr += 0x0A; //move to the correct place in the bootloader (where the RCALL to tinyTuner() is)
  
  SPMCSR = CTPB; //clear the temporary page buffer - this sets all bytes to 0xFF so as not to change any bytes we don't want to
  __boot_page_fill_short((uint16_t)(void*)addrPtr,(uint16_t)0x00); //write a NOP instruction to prevent calling tinyTuner when it doesn't exist anymore.
  __boot_page_write_short((uint16_t)(void*)addrPtr); //program the whole page. Any byte where temp=0xFF will remain as they were.
  boot_spm_busy_wait(); //wait for completion
  
  putstr_t(PSTR("Calibration saved and TinyTuner Deleted\r\n"));
  putstr_t(PSTR("\r\n\r\nEnabling Bootloader and Rebooting\r\n\r\n"));

  __asm__ __volatile__ (
#ifdef VIRTUAL_BOOT_PARTITION
    // Jump to WDT vector
    "ldi r30,4\n"
    "clr r31\n"
#else
    // Jump to RST vector
    "clr r30\n"
    "clr r31\n"
#endif
    "ijmp\n"
  );
  while(1); //to shut the compiler up - really the code doesn't return.
}