Max Baud Rate for Arduino Uno

The testcode has some overhead for calling ProductID(); .

you might strip off a few micros per call if you write out the function in the loop. - no function call overhead -

A call to ProductId will result in at least 2 function calls ProductId() and readRegister()
signed char ProductID(void)
{
return (signed char)ReadRegister(Product_ID);
}

Can you do the test again but then with a call to ReadRegister(Product_ID); ? then you can calculate the overhead of the additional function call!