It's difficult to say exactly why the ?-> syntax would be faster in one context but slower in another without more information. However, it's worth noting that the empty() function is not equivalent to checking for null. empty() will return true for null, false, 0, '', and a few other values, so it's possible that the empty() check is adding some overhead in the second example.
One thing to try would be to change the empty() check to a strict null check ($item->created_at !== null) and see if that makes a difference.
Another thing to consider is that microbenchmarks like the one posted in the question can be misleading. It's possible that the difference in performance is due to some other factor that isn't being accounted for in the benchmark.
Without more information and testing, it's difficult to say for sure what's going on here.