The whole retry loop could be removed in my opinion. This is a basic upsert. The variables used for flow of control are deterministic so the retry is not really necessary. In general the network is where unexplained nonsense happens. If a retry policy (of the entire procedure) is an operational requirement then it ought to be handled outside the proc imo. For .NET a really, really great way to handle retry, circuit breakers, etc. is using Polly.
Is there a unique constraint on object_name in the GID_Values table? Is it possible to add other constraints to this table? Because the error checking being done in this proc could (some would argue 'should') happen in DDL. The NULL error checks on input variables are unnecessary because neither of the variables (@chrObjectName and/or @QtyNeeded) has been assigned a NULL default. The proc would throw an exception if a null value were passed to either variable. If custom error messages are required it could be handled in DDL too (I'm pretty sure (I'd have to review it)).
The input variable types are not consistent with the table described in the 2nd docx document. Object_name is listed as char(30) also gid_value and gid_values_sid are listed as integer. The proc accepts varchar(30) and decimal(12,0)'s. Why? Implicit type conversions are risky imo. There was just a thread on SSC, not sure where, about how different decimal types don't equal each other.
Here's a rough attempt at new code. I just carried over your error handling but it could be looked at too (I think you want to rethrow before the rollback). Because you're running in production at volume and because there are lots of unknowns this is meant only as suggestions for further investigation.
ALTER PROCEDURE [dbo].[prGetGid]
@relGidValue int OUTPUT,
set nocount on
throw 16, 'Object Name is blank. Contact product support. ', 1;
IF @QtyNeeded < 1
throw 16, 'Quantity needed is less than 1. Contact product support. ', 1;
/* first try to insert */
insert GID_Values ([object_name], gid_value, last_touch)
values (rtrim(@chrObjectName), 0, @l_today);
select @rowcount = @@rowcount;
/* second, if 0 rows were inserted then update */
gid_value = gid_value + @QtyNeeded,
last_touch = @l_today,
@relGidValue = gid_value + 1
[object_name] = rtrim(@chrObjectName);
select @updcount = @@rowcount;
throw 16, 'Error Creating a Unique Identifier. Contact product support. ', 1;
IF (XACT_STATE()) <> 0
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
Aus dem Paradies, das Cantor uns geschaffen, soll uns niemand vertreiben können