Using top level statements:
int health = AskInt("How much health does the monsert have? Enter a whole number: ");
while (health > 0) {
health -= AskInt("How much damage did you do?");
if(health <= 0)
Console.WriteLine("Monster has died!!");
else
Console.WriteLine($"Monster has {health} life left");
}
int AskInt(string question){
while (true) {
Console.WriteLine(question);
if (int.TryParse(Console.ReadLine(), out int r))
return r;
}
}
AskInt is a method that asks for an integer and repeats the question if the user types garbage. Your logic has some superfluous elements; minimally we can get away with a loop that repeats while the monster has health. If it does not, then the loop ends after printing the died message and the program exits, otherwise it prints the life and asks for the damage again..
Echo jmc's sentiments about goto; it's very 1980s way of writing convoluted code and is usually entirely avoidable. I haven't used goto in a C# program in the last 20 years