Yes, failed jobs do not become expired automatically to allow you to re-queue them without any time pressure. So you should re-run or delete them manually, or apply AutomaticRetry(OnAttemptsExceeded = AttemptsExceededAction.Delete) attribute to a method to delete failed jobs automatically.
Hangfire.State table records have foreign key to a Job table, so they are being removed at the same time with jobs.
Counter table was a real problem, but in the latest pre-release version records are being automatically aggregated.