Type inference infers a static type for every expression in a program. Hindley-Milner is such a type inference algorithm.
Gradual typing allows you to partition your program into typed and untyped parts. The untyped parts need not even be typable under your type system.
Type inference and gradual typing can be combined. See: Siek and Vachharajani: Gradual typing with unification-based inference http://dl.acm.org/citation.cfm?id=1408688
The idea of that paper is that you want to do type inference for the statically typed part of your program in a gradual type system.
Also, type inference doesn't mix very well with dynamic types ("dynamic is viral", or similar things, I've briefly skimmed this post and I think it makes the point: http://ericlippert.com/2012/11/09/dynamic-contagion-part-two... )