I second this feature!

For the time being, here's a scripted fix to maintain a global variable per CID of enabled features, and substitue time= by formatting $gmt if 'server-time' is NOT within the list of 'capabilities' which "should" in theory fix the timestamp in the past/future issue when server time isn't the same as your own. mIRC's internal time features like $gmt and $ctime I believe are all based by your system's clock.

Code
on *:START: { unset $+(%,ircv3.*) }
on *:EXIT: { unset $+(%,ircv3.*) }
on *:DISCONNECT: { unset $+(%,ircv3,.,$cid) }

raw CAP:*: {
  var %Cap = $var($+(%,ircv3,.,$cid),1).value , %Type = $2
  tokenize 32 $3-
  if (%Type = LS) { }
  elseif (%Type = ACK || %Type = NAK) { 
    while ($0) {
      if (-* iswm $1) { var %Cap = $remtok(%Cap,$mid($1,2),1,32) }
      else if (%Type = NAK) { var %Cap = $remtok(%Cap,$1,1,32) }
      else { var %Cap = $addtok(%Cap,$1,32) }
      tokenize 32 $2-
    }
    set $+(%,ircv3.,$cid) %Cap
  }
}

on *:PARSELINE:in:*:{
  var %pl = $parseline
  if ($parseutf) { var %pl = $utfdecode(%pl) }

  ; Replace time= tag with our own localtime if we do not have server-time CAP
  if (!$istok($var($+(%,ircv3,.,$cid),1).value,server-time,32)) { var %pl = $regsubex(%pl,/(^@(?:[^ ]+)?time=)([^ \x3b]+)/,\1 $+ $replace($asctime($gmt,yyyy-mm-dd!HH:nn:ss),!,T) $+ Z) }

  .parseline -itu0 %pl
  return
}

Here's an example of Debug output, testing on a local version of UnrealIRCd, turned on echo message to see the return result
Note: the only "Notable" difference here is the loss of milliseconds but as far as I can tell this doesn't affect anything.
Code
-> irc.example.org @label=0 PRIVMSG #Talon :moo?
<- @label=0;msgid=ewAqCDBZHDZZtQgRW6uI1O;time=2022-12-02T05:25:59.722Z :Talon!Talon@localhost PRIVMSG #Talon :moo?
-> irc.example.org CAP REQ :-server-time
<- :irc.example.org CAP Talon ACK :-server-time
-> irc.example.org @label=0 PRIVMSG #Talon :moo again?
<- @label=0;msgid=fgDLXYglqvS8ExDLALLY95;time=2022-12-02T05:26:21Z :Talon!Talon@localhost PRIVMSG #Talon :moo again?