Olá Edson!
O 204, neste caso, não me parece uma resposta correta para o client, uma vez que a request realmente falhou ao encontrar um recurso específico e caracteriza um client error, o que nos leva a família 4xx e não 2xx (sucesso). (link)
The HTTP 204 No Content success status response code indicates that a request has succeeded, but that the client doesn't need to navigate away from its current page.
This might be used, for example, when implementing "save and continue editing" functionality for a wiki site. In this case a PUT request would be used to save the page, and the 204 No Content response would be sent to indicate that the editor should not be replaced by some other page.
A 204 response is cacheable by default (an ETag header is included in such a response).
O 400 é uma resposta genérica para qualquer erro da família 4xx, então estaria correto retornar ele, mas é não é nada específico. (link)
The HyperText Transfer Protocol (HTTP) 400 Bad Request response status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error (for example, malformed request syntax, invalid request message framing, or deceptive request routing).
412 está mais relacionado com uma pré-condição de acesso ao recurso, o que não parece ser o caso. Nesse caso, o recurso existe, mas o client não tem a pré-condição necessária para acessar este recurso. (link)
The HyperText Transfer Protocol (HTTP) 412 Precondition Failed client error response code indicates that access to the target resource has been denied. This happens with conditional requests on methods other than GET or HEAD when the condition defined by the If-Unmodified-Since or If-None-Match headers is not fulfilled. In that case, the request, usually an upload or a modification of a resource, cannot be made and this error response is sent back.
Quanto ao 428, não existe uma pré-condição para acessar o recurso que não seja o próprio parâmetro enviado (id) existir, ou seja, poderia considerar este status se o ID não fosse informado (na minha experiência, geralmente retorna 400 nestes casos). (link)
The HTTP 428 Precondition Required response status code indicates that the server requires the request to be conditional.
Typically, this means that a required precondition header, such as If-Match, is missing.
When a precondition header is not matching the server side state, the response should be 412 Precondition Failed.
O 404 indica que o server não encontrou o recurso específico pesquisado, por isso faz sentido nesse seu cenário. (link)
The HTTP 404 Not Found response status code indicates that the server cannot find the requested resource. Links that lead to a 404 page are often called broken or dead links and can be subject to link rot.
A 404 status code only indicates that the resource is missing: not whether the absence is temporary or permanent. If a resource is permanently removed, use the 410 (Gone) status instead.