They don't avoid them, they embrace them using the pattern match syntax.
But functional programming is largely orthogonal to object oriented programming, so absolute majority of "functional" languages are also object oriented, including clojure. In fact clojure's multi-methods are even better than plain virtual methods of Java, because they can dynamically dispatch on types of multiple arguments, not just the first one.
There is one purely functional language that does not have inheritance and thus does not have dynamic polymorphism, Haskell. In Haskell you can define multi-methods via type classes, but the types are resolved at compile time. To have varying types at runtime, you have to create a union type and you either have to write the function with pattern match (which is like the if chain, but much more convenient) or ask the compiler to derive the method by composing the methods of the constituent types.