Reading from documentation, the priority goes:
User Time Zone > Site Time Zone > Server Time Zone
While DateTime.Now is always the server's time (not necessarily the Kentico's "Server time zone" time, but just the actual physical computer's time), the GetSiteDateTime(DateTime.Now) i believe will be the time in respect to the User/Site/Server.
Bryan created a blog about it here.
One issue with your testing and confusion is that when you do "GetSiteDateTime(DateTime.Now)" i think the server assumes the given parameter (which you pass DateTime.Now) is the time based on the Server Time Zone, not the computer's time zone. So it assumes the time given is in the Server Time Zone's UTC.
So say the Physical Computer is UTC +1, and the time is 8:00 am (UTC+1).
If you set the Server Time to UTC +2, and you pass it the current DateTime.Now, it assumes that 8:00am is the UTC +2 time.
So when you say "My site timezone is UTC +3", it takes the 8:00am as UTC+2 and increases the hour by 1 to make it UTC+3.
I could be wrong, but that seems to be what is occurring.