Negarse a usar lo que el motor te da 'gratis' raramente tiene sentido. No solo es esfuerzo innecesario, es como introduces errores inesperados y limitas al motor a la hora de hacer optimizaciones.
P.D: Yo trabajo en parte construyendo un motor de base de datos desde cero(
https://spacetimedb.com) y te puedo asegurar que cada componente se hace con mas detalle de lo que te puedes imaginar. Ahora estoy solamente generando el diseño básico de la autenticación y llevo 3 semanas, como 10 borradores y todo porque en un motor de base de datos hay que tener en cuenta un montón de casos extremos.
Usar el soporte de autonumericos del motor es lo que se debe de hacer a menos que tengas una buena razón, que SOLAMENTE puede ser:
* Necesitas un id universal, así que usas una UUID
* Necesitas evitar `saltos` para el caso de facturas, que entonces es complicado de hacer correcto, porque no solo debes hacer la lógica correctamente sino que debes coordinar a todas tus app que usen un modo transaccional mas estricto `SERIALIZABLE` y eso que no estoy seguro como seria en sql server
* Tienes una llave natural