Short Version
It was fixed in SQL Server 2017—but you have to opt-in to the fix.
Long Version
This was a "won't fix" bug introduced in SQL Server 2012.
It was fixed in SQL Server 2017; but you have to manually enable the fix in your database:
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE=OFF;
You can check the current setting in your database using:
SELECT * FROM sys.database_scoped_configurations WHERE name = 'IDENTITY_CACHE'
IDENTITY_CACHE = { ON | OFF }
Applies to: SQL Server (Starting with SQL Server 2017 (14.x)), Azure SQL Database and Azure SQL Managed Instance
Enables or disables identity cache at the database level. The default is ON. Identity caching is used to improve INSERT performance on tables with identity columns. To avoid gaps in the values of an identity column in cases where the server restarts unexpectedly or fails over to a secondary server, disable the IDENTITY_CACHE option. This option is similar to the existing Trace Flag 272, except that it can be set at the database level rather than only at the server level
This restores the pre-SQL Server 2012 behavior.
And then the bellyaching
You will then hear a small, but vocal, group:
But you could still have gaps!
We will have the exact same number of gaps if we used a SEQUENCE with NO CACHE and an increment of 1, which is the exact same number of gaps we had before SQL Server 2012: zero.
There is technically a performance penalty. But the cost of generating a new identity value is in the noise of performance metrics. You will not experience any performance issues by returning to the SQL Server 6.5, 7, 2000, 2005, 2008 default. It only got introduced in 2012 to solve a problem no one was experiencing. And as a result created thousands of problems that everyone has to Google and solve over, and over, and over, and over and over, and over, and over, and over. It's fine to turn it off—it's micro-optimization that should never have been turned on.