First off, there's no $text identifier in mIRC. Secondly, your usage of the $time identifier is incorrect.
Code:
on *:text:!gmt & &:#:{
  if !$istok(+ -,$2,32) || $3 !isnum 0-12 {
    .notice $nick Sorry $nick $+ $chr(44) You have typed an incorrect code :(
    .notice $nick Usage is !gmt + <number of hours> or !gmt - <number of hours>
  }
  else {
    .notice $nick GMT $2- = $asctime($calc($gmt $2 ($3 * 3600)))
  }
}


Here's an explanation of my code:
The first line is the ON TEXT event, which requires !gmt to be the first item.
The 2nd & 3rd items are represented by the & wildcard, which matches any single 'word'. In this case, 'word' is defined as the number of characters between two spaces.
In the 2nd line, I check to ensure that the 2nd item is either a + or - symbol (don't want to get an * or / in there, or the math would still work, but you could get one heck of a weird number).
Next, in the 2nd line, I ensure that the 3rd item is a number, and I included a range of 0 to 12, so that they can't enter a number of 13 hours (for example).

If you don't like the format of the date/time that is provided with the default format of $asctime, then you should read up on the proper formats that are available for that identifier.
/help $asctime