Should an answer be down-voted even if it works but it promotes bad practices? Bad practices means it should never be done.
This is one of those rare occasions where, if you do downvote, it's probably worthwhile to take a moment and explain in a comment why you are downvoting. Otherwise, your downvote will make no sense on an otherwise perfectly good solution to a problem.
Regardless, votes are yours to do with what you wish, so long as you don't use them for abusive practices like serial or sock voting. In general, a good rule of thumb to follow is this: use your vote to express your opinion of an answer's usefulness.
Should I down-vote an answer that works but promotes bad practices?
"It works" is not enough. (Often, it only appears to be working; something I often encounter when reviewing C or C++ answers is
printf("%d", sizeof(TYPE)), which is undefined behavior, but sometimes it seems to work correctly.) An answer should not mislead people. If something "works" in some cases, but due to bad practices in it it won't work in a more general case, it deserves a downvote for sure.
But: the downvote is not for punishment. It would be good to comment as to why you downvoted, i. e. what is wrong with the answer. The ultimate goal is to have the author of the answer fix his code so that it no longer suggests the use of bad practice. If the answer is fixed, remove your downvote.
There's a great risk of flame wars with such approach. Consider 2 groups of people, one thinks that A is bad practice and B is good practice, and the second thinks opposite.
In my opinion, it's better to upvote answer you think is better and reserve downvoting for the situations, when the answer doesn't asnwer the question or is not working.