The answer as to which method is best suited to what you've asked depends on your experimental design and research question; there are a number of different ways to go about this task that will lead you to more or the less the same destination, but some will be more helpful than others depending on your ultimate goal. Are you starting with a group of genes of particular interest? Are you looking to identify significantly differentially methylated CGIs under a particular biological condition and then examine the putative function of the affected genes?
A CpG island (CGI) is itself a CpG cluster, i.e., an area that is dense with CpG dinucleotides in a CG-rich region of the genome, so you can use the terms synonymously. In vertebrates, the majority of promoters contain CGIs (~70%) so they're easy to find, but their interpretation will be more cryptic when you start looking at CGIs outside of promoters, i.e., in gene bodies or 5' UTRs, where often the effect of methylation is reversed from its effect in a promoter region.
The R package ensembldb has an easy and straightforward `promoters()` function you can use to obtain such a list once you generate an `EnsDb` object that downloads and stores genomic information from Ensembl for your organism of interest. You can use this list of promoters to, for example, intersect a set of differentially methylated CGIs you have identified through some earlier analysis to get the gene names these promoter regions act on. But before you jump into the programmatic side of things, I'd recommend clarifying what it is you are seeking to understand in a biological sense and why!